Ffmpeg x264 закодировать настройки

моя новая видеокамера Canon Vixia HF G30 имеет возможность кодировать непосредственно до 35 Мбит/с Mp4 в 1080p60, и это делает хорошую работу. Я в основном использую его для записи баскетбольных игр моей дочери.

мне нужно сделать основные моменты из файлов камеры, и я хочу, чтобы сохранить как можно больше качества и ясности, как это возможно. Вот рабочий процесс, который я разработал с моим ограниченным пониманием FFmpeg:

Шаг 1.) Соедините произведенные камерой зажимы мп4 в один файл мп4 представляя одну игру. Вот репрезентативная команда, которую я использую для этого шага из командной строки Windows (коробка DOS):

ffmpeg -f concat -i "mylancomputerfCanon13.09.21_san_francisco_game2gameclipsfromcamera.txt" -c copy "mylancomputerfCanon13.09.21_san_francisco_game2joined_fullgame.mp4"

это соединяет игровые клипы в игровое видео без перекодирования (я считаю), и это хорошо (это быстро и никаких дополнительных артефактов сжатия не вводится).

Шаг 2.) Вырезать выделенные клипы из игрового видео. Вот репрезентативная команда, которую я использую для этого шага:

ffmpeg -ss 00:00:06.00 -i "mylancomputerfCanon13.09.21_san_francisco_game2joined_fullgame.mp4" -acodec copy -vcodec copy  -t 00:00:20.00 "mylancomputerfCanon13.09.21_san_francisco_game2.mp4"

это производит следующее 20-секундный клип, начиная с 6 секунд в видео игры:

Образец Выделить (85 Мб)

Шаг 3.) Мне требуется 2-секундная пауза в начале каждого выделенного клипа, где наложение текста идентифицирует мою дочь. Для этого я делаю растровое изображение из первого кадра клипа:

ffmpeg -i "mylancomputerfCanon13.09.21_san_francisco_game2.mp4" -ss 00:00:00.00 -f image2 -vframes 1 -deinterlace "mylancomputerfCanon13.09.21_san_francisco_game2freezeframe.bmp"

здесь результат.

затем петли видео в течение 2 секунд с ХПН 0 вводить никаких дополнительных артефакты:

ffmpeg -loop 1 -r 59.97 -i "mylancomputerfCanon13.09.21_san_francisco_game2freezeframe.bmp" -c:v libx264 -crf 0 -pix_fmt yuv420p  -t 2  "ExcelherofCanon13.09.21_san_francisco_game2freezeframe.mp4"

затем добавьте текстовую метку, идентифицирующую Фиону:

ffmpeg -i "mylancomputerfCanon13.09.21_san_francisco_game2freezeframe.mp4" -vf drawtext="fontfile=/Windows/Fonts/Corbelb.ttf:text='Fiona':fontsize=40:fontcolor=yellow:x=1321:y=417"  -b:v 35M -minrate 35M -maxrate 35M -bufsize 35M    -profile:v high -level:v 4.2  -refs 2  -pix_fmt yuv420p  -bf 0    -r 59.97 "mylancomputerfCanon13.09.21_san_francisco_game2freezeframeannotated.mp4"

который создает этот файл: [ ehasamples.excelhero.com/video/1freezeframeannotated.mp4 ]

(суперпользователь разрешил мне включать только 2 живые ссылки)

теперь добавим в клип тихий звуковой поток:

ffmpeg -f lavfi -i aevalsrc=0:0:sample_rate=48000 -i "mylancomputerfCanon13.09.21_san_francisco_game2freezeframeannotated.mp4" -shortest -c:v copy -c:a aac -b:a 255k -strict -2 "mylancomputerfCanon13.09.21_san_francisco_game2freezeframeannotatedwithsilentsound.mp4"

в результате: [ ehasamples.excelhero.com/video/1freezeframeannotatedwithsilentsound.mp4 ]

(суперпользователь только разрешил включить 2 живые ссылки)

выше 2-секундное видео с моей дочерью, помеченной в приостановленной анимации с пустым звуковым потоком.

Шаг 4.) Последняя операция заключается в присоединении 2-секундного видео к полному клипу с камеры. Я могу легко рендерить фильтр, производя один выходной файл из этих двух входных файлов следующим образом:

ffmpeg -i "mylancomputerfCanon13.09.21_san_francisco_game2freezeframeannotatedwithsilentsound.mp4" -i "ExcelherofCanon13.09.21_san_francisco_game2.mp4" -filter_complex "[0:0] [0:1] [1:0] [1:1] concat=n=2:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" -c:v libx264 -r 59.97 "mylancomputerfCanon13.09.21_san_francisco_game2done.mp4"

но это не отличное решение. Это медленно, потому что оригинальные кадры с видеокамеры рендеринг заново с введением новых артефактов сжатия. Я могу добавить "- crf 0", чтобы получить рендеринг без потерь, но это раздувает размер клипа более чем на 1000%, в этом случае в результате чего наш образец клипа более гигабайта. Так что это не практическое решение.

поэтому я хочу использовать concat demuxer вместо фильтра:

ffmpeg -f concat -i "mylancomputerfCanon13.09.21_san_francisco_game2clipfiles.txt" -c copy "mylancomputerfCanon13.09.21_san_francisco_game2doneBAD.mp4"

при таком подходе операция выполняется быстро, так как нет перекодировки. Но полученный файл не играет правильно. Вот это:

[ ehasamples.excelhero.com/video/1doneBAD.mp4 ]

(суперпользователь разрешил мне включать только 2 живые ссылки)

2-й снимок показывает всего 22 секунды. Хотя видео не воспроизводится должным образом, звук, кажется, работает просто отлично. Таким образом, я предполагаю, что два файла (клип с камеры и 2-секундный клип метки) просто слишком далеки друг от друга по их относительной кодировке. Я попытался получить их как можно ближе к идентичным как я могу с точки зрения кодирования с помощью MediaInfo и с помощью FFProbe, и вышеупомянутые серии команд являются моими лучшими, но, по-видимому, недостаточно.

Итак, вопрос у меня просто такой: возможно ли с FFmpeg сделать мой помеченный клип достаточно похожим на закодированные кадры с камеры, чтобы Concat demux преуспел? Если да, то как?

весь этот рабочий процесс управляется пакетным файлом и очень прост с моей стороны, и поэтому мне это нравится, и я надеюсь использовать это методология, позволяющая мне быстро редактировать основные моменты игр в будущем.

наоборот, есть ли лучший (более быстрый, без перекодирования) рабочий процесс с использованием FFmpeg?

Благодарю вас за вашу помощь.

23
задан fionasdad
28.04.2023 14:15 Количество просмотров материала 3645
Распечатать страницу

1 ответ

возможно, вы захотите использовать более быстрый кодек без потерь, который займет больше временного пространства, например ffvhuff или что-то еще, если у вас быстрые диски. В противном случае, используйте -preset ultrafast с -crf 0. (то же, что -qp 0, включает режим без потерь.)

x264 slow только сжимает крошечный лучше, чем superfast в режиме без потерь, кстати. Возможно, если бы у вас была анимация с некоторыми битно-идентичными блоками более 1 кадра назад, поэтому несколько кадров ref могли бы помочь, тогда более высокие настройки сделали бы больше. Мой вывод, для 1H: 22m NTSC DV deinterlace (720x480p60), были 27.9 GB (superfast) против 27.0 ГБ (slow), или 55.0 ГБ для ffvhuff, или 37.6 ГБ для ffv1 (настройки по умолчанию, несколько меньше, с еще более медленными настройками сжатия/распаковки ffv1) все в yuv420). CABAC кодирует / декодирует при этом битрейте занимает тонну процессора; я должен был использовать ultrafast вместо superfast или просто -x264-params cabac=0.

TL;DR: используйте libx264 -preset ultrafast или ffvhuff для промежуточных файлов.

ffv1 или h.264 с CABAC не стоит кодировать / декодировать время процессора, когда размер файла на самом деле не имеет значения. И huffyuv не делает yuv 4:2: 0, для этого вам нужен ffvhuff. Lagarith-это GPL, но декодер-только в ffmpeg, и кодировщик не портирован ни на что, кроме windows. (компромисс между скоростью и сжатием, вероятно, не слишком впечатляет по сравнению с x264, за исключением, возможно, бесшумных источников, таких как анимация, где предсказание / прогон до кодера энтропии будут преуспевать.)

кроме того, уверен, что вы можете использовать -vf drawtext во время шага видео bmp - > 2 sec. И почему вы используете жесткий CBR (битрейт 35M, максимальный битрейт 35M) для этого? Почему бы не просто без потерь для этого шага?

обычно не полезно для конкретного профиля для x264. Это устанавливает флаги профиля в выходных данных к самому низкому, это может, Данный то, что это помещает в битовый поток. (т. е. он будет установить профиль на высокий, если 8x8dct=1, и выясните, какой уровень основан на Rez, битрейте и ref кадрах.) edit:-profile также заставляет x264 понизьте количество кадров ref или другие настройки, необходимые для соблюдения ограничений для данного профиля. Тем не менее, редко нужно использовать его, если не ориентироваться на какой-то декодер HW.

что полезно при кодировании с потерями, так это использование -preset slower или что-то, чтобы x264 использовал больше процессорного времени, но получал больше качества для того же битрейта. Это в значительной степени заменяет необходимость настройки всех ручек, таких как ref frames, trellis, adaptive B frames, motion search и т. д.

попытаться ответить фактическому вопрос, что важно для того, чтобы функция concat разных сек.Потоки 264 (от датчика вашей камеры и из bmp -> x264 в) должно быть разрешение, цветовое пространство (yuv420 против yuv444 или что-то), и, вероятно, сек.264 параметры потока, как чересстрочный или нет.

если вы планируете сохранить всю вещь 35Mbit/s вокруг, и не хотите, чтобы получить его до разумного размера файла, который вы могли бы отправить через интернет, то вы хотите, чтобы соответствовать все, что ваша камера аппаратный кодер работает. Или вы можете запустить все это через x264, что займет время, но с -preset veryslow вы можете вероятно сделать 10Мбит / с, или возможно даже 5, с меньшей заметной потерей качества. Попробуй -crf 18, это вообще почти прозрачный. (Да еще можно легко заметить разницу, если вы делаете паузу и переключаться между x264 и исходных кадров).

If должны можно сделать весь процесс в одном вызове ffmpeg. Filtergraph, который в конечном счете заканчивается в фильтре concat, может иметь цепочки, которые генерируют 2 секунды повторяющегося неподвижного изображения + тишина, чередующаяся с цепочками, которые являются просто inputfile - >output.

(или, если вы действительно хотите не xcode выход камеры, и может выяснить, что отличается между выходом вашей камеры и x264: один вызов ffmpeg на неподвижное изображение, а затем один окончательный конкат.)

аппаратные кодеры в телефонах и камерах обычно довольно плохие. Единственный как они выглядят хорошо, бросая много битрейта на проблему. x264 обычно может сделать намного лучше, особенно. с-задано медленно, медленнее или veryslow. Очевидно, что будет еще одно поколение потерь, но вы обычно можете сократить битрейт видео до 2 Мбит/с для голливудских фильмов 1080p@24fps с очень резкой детализацией. Шумные портативные источники с высоким движением все время будет принимать больше бит, но -crf 18 постоянн качество, поэтому я порекомендовал бы это как что-то которое будет хорошо достаточно для рассматриваю даже вблизи на хорошем мониторе. Тем не менее, я, вероятно, все равно сохраню исходные источники, поскольку хранилище становится дешевле, и вы никогда не сможете восстановить исходное качество с выхода x264. Тем не менее, я бы просто держал их, чтобы они были. Если вы отдаете этот файл кому-либо или копируете его через интернет, x264 -preset slow делает хорошие вещи. Даже по умолчанию -preset medium - это хорошо. Если вы не установите целевой битрейт или качество, по умолчанию я думаю -crf 23.

Я не делаю много, чтобы ответить, как получить x264, чтобы сделать вывод, который вы можете связать с не-xcoded битовым потоком вашей камеры, так как это не то, что мне нужно было делать, и это действительно не интересует меня, извините. В основном отвечая, поэтому любой, кто хотел следовать вашей отправной точке, не будет водить-crf 0 или что-то глупое. :P

1
отвечен Peter Cordes 2023-04-29 22:03

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя

Похожие вопросы про тегам:

audio
ffmpeg
video
video-conversion
video-editing
Вверх