Видео, которые я пытаюсь объединить, может иметь разные технические метаданные, например, код c, разрешение и т. Д. c. Поэтому я написал фильтр-граф, который работает для моих целей. Моя полная команда может выглядеть так:
ffmpeg -i "vid1.mp4" -i "vid2.mp4" -i "vid3.mp4" -filter_complex_script "filtergraph.txt" -map "[outv]" -map "[outa]" -c:v libx264 -r 60 -preset medium -crf 24 -c:a aac -b:a 160k "output.mp4"
И «filtergraph.txt» выглядит так (автоматически генерируется моим собственным сценарием ранее). У меня есть фильтры, чтобы изменить все входные разрешения на Full HD. (Новые строки в следующем фрагменте просто представлены для удобства чтения, они не содержатся в моем файле filtergraph.txt)
[0:v]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1[v0];
[1:v]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1[v1];
[2:v]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1[v2];
[v0][0:a][v1][1:a][v2][2:a]concat=n=3:v=1:a=1[outv][outa]
Теперь в этом случае все работает, у меня есть три исходных видео, они могут иметь разные разрешения, кодеки или даже разные частоты кадров - все они объединены в одно выходное видео Full HD 60 FPS.
Проблема в том, что я хочу объединить большое количество видеофайлов и получить ошибку, что команда содержит слишком много символов для cmd. Вот почему я уже поместил граф фильтра в отдельный файл и прочитал его, используя -filter_complex_script
, который работает.
Но он все равно может быть слишком длинным, если у меня есть несколько сотен исходных файлов, которые я хочу объединить.
Насколько я тестировал, я не могу использовать -f concat -i listOfFiles.txt
, потому что каждый исходный файл должен быть в том же коде c, тогда разрешение et c, и я не мог использовать фильтр графа для масштабирования из-за того, что ffmpeg попытается выполнить конкататацию до того, как демодулированный вывод войдет в фильтр.
Итак, как мне объединить сотни видео при изменении их размера в Full HD и применении других фильтров, но сохранить короткая строка cmd?
Есть ли что-то похожее на -filter_complex_script
, но для входных файлов? Или мне придется сначала закодировать каждое исходное видео в нужный формат, а затем объединить его с потоковой копией?