Я считаю, что libx264 теперь может выполнять 10-битное кодирование 4: 2: 2, но я не могу заставить его работать. Я использую ffmpeg (информация ниже), и я также непосредственно пробовал кодировщик x264. я пробовал
ffmpeg.exe -i input.mov -c:v libx264 -profile:v high422 -crf 20 -pix_fmt yuv422p output.mp4
и это дает хороший вывод 4: 2: 2, но только на глубине 8 бит,
[libx264 @ 00000000055a9de0] profile High 4:2:2, level 4.0, 4:2:2 8-bit
и я попробовал
ffmpeg.exe -i input.mov -c:v libx264 -profile:v high10 -crf 20 -pix_fmt yuv422p output.mp4
и это дает мне ошибку:
x264 [error]: high10 profile doesn't support 4:2:2
[libx264 @ 00000000051ead60] Error setting profile high10.
[libx264 @ 00000000051ead60] Possible profiles: baseline main high high10 high422 high444
В документации x264 --fullhelp я нахожу:
--profile <string> Force the limits of an H.264 profile
Overrides all settings.
[...]
- high10:
No lossless.
Support for bit depth 8-10.
- high422:
No lossless.
Support for bit depth 8-10.
Support for 4:2:0/4:2:2 chroma subsampling.
- high444:
Support for bit depth 8-10.
Support for 4:2:0/4:2:2/4:4:4 chroma subsampling.
Таким образом, он может делать 4: 2: 2 на 10-битной глубине и даже 4: 4: 4 на 10-битной, очевидно, но нет указаний на то, как установить выходную битовую глубину. Есть опция, --input-depth <integer> Specify input bit depth for raw input
но ничего для битовой глубины вывода.
Ответы:
x264 поддерживает как 8-битные, так и 10-битные выходы, и вам не нужно делать ничего особенного.
ffmpeg
При использовании
ffmpeg
вы можете увидеть, какие форматы пикселей и битовую глубину поддерживает libx264:10-битные форматы пикселей: yuv420p10le, yuv422p10le, yuv444p10le.
x264
Вы также можете проверить
x264
поддерживаемые битовые глубины:Ранее вам приходилось компилировать x264 с
--bit-depth=10
, а затем связыватьffmpeg
его с 8-битным или 10-битным libx264, но теперь это не нужно. См. Unify 8-битный и 10-битный CLI и библиотеки для получения дополнительной информации.источник
редактирование: я успешно сделал 10-битное кодирование Ducks Take Off .
Первый способ: я создал 10-битный двоичный файл x264, который статически связывает libx264.
(Сверхбыстрое и низкое качество, потому что это доказательство концепции, а не тест качества.) Я не компилировал его с помощью swscale. (Он был недоволен RGB-пикселем fmt в libavutil или чем-то еще). Он выдает ошибку, если входное цветовое пространство не совпадает
--output-csp i444
, что на самом деле хорошо, если вы не хотите, чтобы x264 случайно уменьшил цветность. Он работал нормально, когда я подавал несколько кадровyuv444p14le.y4m
, получая 10-битный вывод. (Он может обрезать битовую глубину, но не уменьшать цветность без swscale.)Второй способ: используйте
LD_LIBRARY_PATH
для выбора 10-битного libx264.soВы можете использовать один и тот же двоичный файл с динамической связью ffmpeg для всего.
Я явно не пытался увидеть что-либо визуально с этими настройками качества. Я просто хотел, чтобы он работал быстро и не тратил кучу дискового пространства, так как я всегда получаю много выходных файлов, когда пытаюсь варьировать вещи.
Отсутствие передачи огромных данных y4m в отдельный процесс x264 привело к тому, что скорость передачи составила 14 кадров в секунду вместо 12, что обеспечивает приличное ускорение для сверхбыстрых. Более медленные кодировки затмят эти издержки.
Мой источник 48-битный RGB. Я обнаружил, что correct_rnd не влиял на вывод mkv. (Бит-идентичные результаты без
-sws_flags
, с-sws_flags +accurate_rnd
, и-vf scale=flags=accurate_rnd
, за исключением нескольких битов в заголовке mkv, вероятно, случайный UDID mkv. Даже с-qp 0
, так что я не потерял его из-за ошибки округления.cmp -l f1 f2 | less
Для сравнения двоичных файлов, которые могут быть то же самое после некоторой начальной разницы. Илиssdeep -p
. Может бытьaccurate_rnd
, по умолчанию сейчас?)Существует один флаг ffmpeg swscaler, который имеет значение, если вы разрешаете ffmpeg уменьшать выборку цветности: lanczos вместо бикубического по умолчанию. (Я предполагаю, что lanczos по-прежнему считается лучшим выбором для высокого качества? Некоторое время не читал.)
highdepth-ffmpeg -i in -pix_fmt yuv420p10le ...encode...opts...
-vf scale=flags=lanczos -sws_flags +accurate_rnd+print_info with_ld_path.420p10.accurate_rnd.lanczos.mkv
Добавление
+lanczos
к-sws_flags
не работает:Если вы попытаетесь подать на вход более 10 бит, ffmpeg откажется.
На самом деле, драйвер ffmpeg libx264 всегда настаивает на подаче x264 именно той битовой глубины, для которой он скомпилирован. например с
-pix_fmt yuv420p
:x264.h говорит:
Я думаю, что внутренне x264 (CLI) всегда должен преобразовывать пиксельные форматы, у кода нет 8-битных входных, 10-битных выходных версий каждой функции. Кроме того, я думаю, что принятие различных входных битовых глубин только в CLI x264, а не в API библиотеки. Мне любопытно, что происходит, когда вы подаете входные данные API, где установлены более высокие биты ... (ffpeg не позволяет вам делать это без взлома кода, так что об этом никто не должен беспокоиться, избегая этого).
Если не указано pix_fmt, ffmpeg выбирает
yuv444p10le
при заданном вводе rgb. Или с помощьюlibx264rgb
, он передает 8-битный RGB в функции, которые ожидают 16-битные (10 из которых являются значительными), и segfaults>. <. Я пойду сообщать, что вверх по течению ...Я сообщу об этом вверх по течению.
Как бы то ни было, оказалось, что было чертовски легко создать себе среду с двойной битовой глубиной для ffmpeg или любой другой программы, которую вы хотите запускать с версиями libx264, libx265, скомпилированными с большой битовой глубиной, и всем, что вам нужно , (Вот почему я назвал это "highdepth", а не просто "10bit" для более короткого имени.)
конец редактирования: ниже приведены мои записи без перекомпиляции. И немного о том, как кросс-компилировать ffmpeg для win64
Попробовал это сам, так как вы не пытались использовать команду cmdline, которая пыталась передать ввод с большой разрядностью в x264.
Имена форматов пикселей ffmpeg (
ffmpeg -pix_fmts
) не просто указывают расположение, они отображаются на точное расположение битов, и, таким образом, каждая комбинация формат + битовая глубина имеет свое имя. Я думаю, что вы ожидали-pix_fmt yuv422p
означать «конвертировать в 422 на той же глубине, что и мои данные».Википедия говорит, что h.264 поддерживает глубину 8-14 бит только с Hi444PP, другие только до 10 бит. Hi444PP - единственный профиль, который поддерживает интеллектуальное кодирование без потерь, которое x264 использует для
-qp 0
или-crf 0
. редактировать: AFAICT, x264 по-прежнему поддерживает компиляцию только для 8, 9 или 10 бит.Во всяком случае, здесь есть куча бесполезного вывода команды, которая не работает, потому что я не перекомпилировал свой локальный x264. (Но он должен работать с перекомпилированным x264. Я мог бы отредактировать этот ответ, если сам захочу поиграть с ним.)
ffmpeg -v verbose -framerate 50 -f image2 -pattern_type glob -i ./3_DucksTakeOff_720p50_CgrLevels_SINC_FILTER_SVTdec05_/'*'.sgi -c:v libx264 -pix_fmt yuv420p10le -profile high10 yuv-high.mkv
Обратите внимание на
Incompatible pixel format 'yuv420p10le' for codec 'libx264', auto-selecting format 'yuv420p'
строку.Вероятно, я не нуждался
-profile
, и с большой битовой глубиной x264 это просто сработало бы. (и потенциально выбирают 444 10 бит, которые вызывает ffmpegyuva444p10le
.) Я думаю, что большая битовая глубина x264 могла бы принятьyuv444p14le
, но все равно выдаст только 10 бит h.264. Командная строкаx264 --fullhelp
довольно явно говорит о глубине выходного бита от 8 до 10, не выше. Странно, что-profile high10
просто тихо игнорируется 8-битной x264.Внутренне x264, скомпилированный для большой битовой глубины, использует 16 бит / с для хранения любых 10-битных данных, поэтому он, вероятно, выполняет поиск движения и так далее с 16-битными значениями. И может DCT выше 16 бит, а не 10 бит, если только скорость игнорируется 6 битами. Это может привести к немного отличающимся коэффициентам DCT, чем если бы вы округлились до 10 бит до DCT. (Таким образом, вы потенциально можете получить другой результат от преобразования до 10 бит до подачи в x264, вместо того, чтобы дать ему 12, 14 или 16 бит.) Я должен попробовать. посмотрите на код или попробуйте, прежде чем что-то придумать. Не верь этому абзацу. :П
(edit: ffmpeg не будет подавать x264-10bit больше, чем 10 бит на компонент. Он будет использовать swscale для уменьшения самой битовой глубины.)
Интересно, насколько сложно было бы исправить x264 и x265, чтобы использовать разные имена для глобальных переменных и функций API при компиляции для высокой разрядности. Затем вы можете собрать обе версии одновременно и связать ffmpeg с обеими версиями. Ffmpeg
libx264
иlibx264rgb
оболочки могут позаботиться о вызове соответствующей версии API в зависимости от входного потока. (В противном случае вам понадобится-c:v libx264-deep
илиlibx264rgb-deep
, в общей сложности, 4 разных x264-кодека в ffmpeg.)Как кросс-компилировать ffmpeg для windows
edit: для windows, я не думаю, что есть что-то более удобное, чем
LD_LIBRARY_PATH
для libx264 DLL, поэтому лучше всего по-прежнему создавать статический двоичный файл большой глубины, а другой - для обычного использования. Высокая глубина libx264 НЕ МОЖЕТ выводить обычную глубину h.264. Не просто штраф за скорость, это просто невозможно.Самый простой способ скомпилировать свой собственный ffmpeg (статический двоичный файл) для Windows - это https://github.com/rdp/ffmpeg-windows-build-helpers . git клонирует репозиторий на Linux-машине (или, возможно, в другой системе с работающим gcc, например OS X?), затем запустите
./cross_compile_ffmpeg.sh --high-bitdepth=y --disable-nonfree=n --build-choice=win64
Для первого запуска потребовалось около 8 часов, так как он собрал MCCW-кросс-компиляцию GCC из исходного кода вместе со всем остальным. (По умолчанию gcc восстанавливает себя несколько раз до начальной загрузки, если вы изначально компилировали его с плохим компилятором.)
Вы можете обновить скрипт сборки с помощью
git pull
, и при повторном запуске он получит последние обновления git для ffmpeg, x264, x265 и, возможно, некоторых других проектов, которые он компилирует из исходного кода. (Для большинства это просто загружает tarballs.)Мой рабочий стол Linux показывает свой возраст. У меня есть виндендо, которое я в основном использую для игр. Так как я начал возиться с кодированием видео, я считаю, что его четырехъядерный Sandybridge тоже очень полезен, особенно. для x265. Вероятно, некоторые функции x265 имеют только версии asm для AVX / SSE4, поэтому на моей машине с SSSE3 Linux (Conroe) она возвращается к C. Это или это более заметно на 1fps ...
источник
brew reinstall x264 --with-10-bit
и все готово, ffmpeg будет использовать новую версию x264 :)Я скачал ffmpeg по ссылке ниже https://sourceforge.net/projects/ffmpeg-hi/?source=typ_redirect
И введите приведенную ниже команду для создания 4: 2: 2 10-битного файла h.264. ffmpeg-hi10-heaac.exe -i "im.mp4" -c: v libx264 -pix_fmt yuv422p10le yuv-high-.ts
источник