我尝试连接的视频可以具有不同的技术元数据,例如编解码器、分辨率等。因此,我编写了一个适合我的目的的过滤器图。我的完整命令如下所示:
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"
Run Code Online (Sandbox Code Playgroud)
“filtergraph.txt”看起来像这样(之前由我自己的脚本自动生成)。我有过滤器可以将所有输入分辨率更改为全高清。(以下代码片段中的换行符只是为了可读性而引入的,它们不包含在我的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]
Run Code Online (Sandbox Code Playgroud)
现在在这种情况下,它可以工作,我有三个源视频,它们可以有不同的分辨率、编解码器甚至不同的帧速率 - 它们全部组合成一个全高清 60 FPS 输出视频。
问题是,我想连接大量视频文件并收到错误,该命令包含太多 cmd 字符。这就是为什么我已经将过滤器图放入一个单独的文件并使用-filter_complex_script
which Works 读取它。
但如果我想要连接数百个源文件,它仍然可能会太长。
据我测试,我无法使用-f concat -i listOfFiles.txt
,因为每个源文件都必须采用相同的编解码器、分辨率等,而且我无法使用filtergraph进行缩放,因为ffmpeg会在解复用之前尝试连接输出进入过滤器。
那么,我如何连接数百个视频,同时将它们全部调整为全高清并应用其他过滤器,但保持命令行简短?
-filter_complex_script
对于输入文件有类似的东西吗?或者我是否必须首先将每个源视频编码为我想要的目标格式,然后将它们与流复制连接起来?