ffmpeg 连接大量具有不同编解码器和分辨率的视频

问题描述 投票:0回答:1

我尝试连接的视频可以具有不同的技术元数据,例如编解码器、分辨率等。因此,我编写了一个适合我的目的的过滤器图表。我的完整命令如下所示:

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”看起来像这样(之前由我自己的脚本自动生成)。我有过滤器可以将所有输入分辨率更改为全高清。 (以下代码片段中的换行符只是为了可读性而引入的,它们不包含在我的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]

现在在这种情况下,它可以工作,我有三个源视频,它们可以有不同的分辨率、编解码器甚至不同的帧速率 - 它们全部组合成一个全高清 60 FPS 输出视频。

问题是,我想连接大量视频文件并收到错误,该命令包含太多 cmd 字符。这就是为什么我已经将过滤器图放入一个单独的文件并使用

-filter_complex_script
读取它,这是可行的。

但是如果我想要连接几百个源文件,它仍然会太长。

据我测试,我不能使用

-f concat -i listOfFiles.txt
,因为每个源文件都必须采用相同的编解码器、分辨率等,并且由于 ffmpeg 会尝试,所以我无法使用filtergraph进行缩放在解复用输出进入过滤器之前进行连接。

那么,我如何连接数百个视频,同时将它们全部调整为全高清并应用其他过滤器,但保持命令行简短?

是否有类似于

-filter_complex_script
但对于输入文件的东西?或者我是否必须先将每个源视频编码为我想要的目标格式,然后将它们与流复制连接起来?

video ffmpeg
1个回答
0
投票

根据我的经验,concat-procedure 会使 ffmpeg 冻结一段时间 - 加载到内存? - 但我刚刚测试过

  1. 循环文件并使用相同的分辨率、sar、dar、fps 对它们进行 1 对 1 的编码(在本例中将所有内容放在同一个文件夹中)

  2. 制作新文件列表

    filelist.txt
    ,包含以下内容:

    file '001.mp4'

    file '002.mp4'

    ...

  3. 转到该文件夹并运行

    ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4

© www.soinside.com 2019 - 2024. All rights reserved.