Моя новая видеокамера Canon Vixia HF G30 имеет возможность кодировать непосредственно до 35 Мбит / с Mp4 при 1080p60, и это делает хорошую работу. Я в основном использую его для записи баскетбольных игр моей дочери.
Мне нужно сделать блики из файлов камеры, и я ХОЧУ СОХРАНИТЬ, КАК МОЖНО КАЧЕСТВО И ЯСНОСТЬ, КАК ВОЗМОЖНО. Вот рабочий процесс, который я разработал с моим ограниченным пониманием FFmpeg:
ШАГ 1.) Соедините созданные MP4 клипы в один файл MP4, представляющий одну игру. Вот типичная команда, которую я использую для этого шага из командной строки Windows (окно DOS):
ffmpeg -f concat -i "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\gameclipsfromcamera.txt" -c copy "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\joined_fullgame.mp4"
Это объединяет игровые клипы в игровое видео без транскодирования (я полагаю), и это хорошо (это быстро и никаких дополнительных артефактов сжатия не вводится).
ШАГ 2.) Вырезать клипы из видео игры. Вот типичная команда, которую я использую для этого шага:
ffmpeg -ss 00:00:06.00 -i "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\joined_fullgame.mp4" -acodec copy -vcodec copy -t 00:00:20.00 "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\1.mp4"
Это приводит к следующему 20-секундному клипу, начиная с 6 секунд в видео игры:
Образец выделения (85 МБ)
ШАГ 3.) Мне требуется 2-секундная пауза в начале каждого клипа, где наложение текста идентифицирует мою дочь. Чтобы получить это, я делаю растровое изображение из первого кадра клипа:
ffmpeg -i "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\1.mp4" -ss 00:00:00.00 -f image2 -vframes 1 -deinterlace "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\1freezeframe.bmp"
Вот результат.
Затем зациклите видео в течение 2 секунд с CRF 0, чтобы не вводить никаких дополнительных артефактов:
ffmpeg -loop 1 -r 59.97 -i "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\1freezeframe.bmp" -c:v libx264 -crf 0 -pix_fmt yuv420p -t 2 "\\Excelhero\f\Canon\2013.09.21_san_francisco_game2\1freezeframe.mp4"
Затем добавьте текстовую метку наложения, идентифицирующую Фиону:
ffmpeg -i "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\1freezeframe.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 "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\1freezeframeannotated.mp4"
Который производит этот файл: [ehasamples.excelhero.com/video/1freezeframeannotated.mp4]
(SuperUser позволил мне только включить 2 прямые ссылки)
Теперь мы добавим тихий звуковой поток в клип:
ffmpeg -f lavfi -i aevalsrc=0:0:sample_rate=48000 -i "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\1freezeframeannotated.mp4" -shortest -c:v copy -c:a aac -b:a 255k -strict -2 "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\1freezeframeannotatedwithsilentsound.mp4"
В результате этого: [ehasamples.excelhero.com/video/1freezeframeannotatedwithsilentsound.mp4]
(SuperUser позволил мне только включить 2 прямые ссылки)
Выше - 2-секундное видео с моей дочерью, помеченной в приостановленной мультипликации с пустым звуковым потоком.
ШАГ 4.) Последняя операция - присоединение 2-секундного видео к полному ролику с камеры. Я могу легко выполнить рендеринг с помощью фильтра, создавая один выходной файл из этих двух входных файлов следующим образом:
ffmpeg -i "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\1freezeframeannotatedwithsilentsound.mp4" -i "\\Excelhero\f\Canon\2013.09.21_san_francisco_game2\1.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 "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\1done.mp4"
Но это не лучшее решение. Это медленно, потому что исходные кадры с видеокамеры воспроизводятся заново с введением новых артефактов сжатия. Я могу добавить «-crf 0», чтобы получить повторный рендеринг без потерь, но это увеличивает размер клипа более чем на 1000%, в этом случае размер нашего клипа-образца превышает гигабайт. Так что это не практическое решение.
Поэтому я хочу использовать дематер concat вместо фильтра:
ffmpeg -f concat -i "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\clipfiles.txt" -c copy "\\mylancomputer\f\Canon\2013.09.21_san_francisco_game2\1doneBAD.mp4"
При таком подходе операция выполняется быстро, так как нет перекодирования. НО, полученный файл не воспроизводится должным образом. Вот:
[ehasamples.excelhero.com/video/1doneBAD.mp4]
(SuperUser позволил мне только включить 2 прямые ссылки)
2-секундное изображение отображает все 22 секунды. Хотя видео не воспроизводится должным образом, звук работает нормально. Поэтому я предполагаю, что эти два файла (клип с камеры и 2-секундный клип с меткой) просто слишком сильно отличаются друг от друга в их относительном кодировании. Я пытался сделать их как можно ближе к идентичным с точки зрения кодирования с помощью MediaInfo и FFProbe, и приведенные выше серии команд являются моими лучшими, но, по-видимому, их недостаточно.
Таким образом, у меня есть следующий вопрос: возможно ли с помощью FFmpeg сделать мой помеченный клип достаточно похожим на зашифрованный материал с камеры, чтобы дему Concat удалось добиться успеха? Если так, то как?
Весь этот рабочий процесс основан на пакетном файле и с моей стороны очень прост, поэтому мне он нравится, и я надеюсь использовать эту методологию, чтобы позволить мне быстро редактировать основные моменты игр в будущем.
И наоборот, есть ли лучший (более быстрый, без транскодирования) рабочий процесс с использованием FFmpeg?
Благодарю за помощь.