减少由于 FFmpeg 输入数量过多而导致的命令行缺陷

减少由于 FFmpeg 输入数量过多而导致的命令行缺陷

我长期使用一个脚本,它使用复杂的过滤器对不同的编解码器进行连接,如下所述这里

本 wiki 给出了以下示例命令:

ffmpeg -i input1.mp4 -i input2.webm -i input3.mov \
-filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mkv

我的问题是,如果您有许多小剪辑需要以这种方式组合,那么后果将非常糟糕。

-filter_complex_script虽然对于这个例子来说,看起来好像复杂的过滤器是麻烦制造者,但是通过将整个过滤器字符串放在外部文件中,可以完美地将压力减轻到一个恒定的负担。

因此,剩下的唯一问题就是输入文件。如果我不受不同路径和冗长的自动生成文件名的限制,我就不会那么容易达到这个限制,但这些是我无法控制的。不幸的是,我的情况已经发展到 Windows 提供给我的 8,000 多个字符已经不够了。

因此,我正在寻找(大致)类似于输入文件脚本的东西。我见过提到连接解复用器有类似的东西,但我不太明白它是如何工作的。据我所知,它会把所有内容扔进一个文件输入中,使执行复杂的过滤器脚本连接变得不可能。更不用说:上面的 wiki 链接明确提到它需要对所有文件使用相同的编解码器、时间基准等,这并不适用于我的情况。

我怎样才能摆脱对命令行长度的担忧,并永远忘记所谓的命令行字符限制?

答案1

一种方法是转移限制。这在一定程度上是有效的。

这个答案说:

POSIX 表示此限制ARG_MAX,在符合 POSIX 的系统上,你可以使用以下命令查询它

$ getconf ARG_MAX    # Get argument limit in bytes

例如在 Cygwin 上这个数字是 32000,而在我使用的不同 BSD 和 Linux 系统上这个数字是从 131072 到 2621440 之间的任何数字。

ARG_MAXCygwin 中的值相对较低(我怀疑可能是 Windows 的一些限制导致的),但它仍然比您提到的 8000 高四倍。我不知道Windows Subsystem for Linux 中的值。

更进一步就是ffmpeg在(可能是虚拟的)Linux 上运行。

相关内容