моя новая видеокамера 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?
Благодарю вас за вашу помощь.