是否可以在文本文件中而不是在命令行中向FFmpeg提供输入文件列表



我需要在命令行上为ffmpeg可执行文件提供许多小文件输入,而且我远远超过了命令行的最大命令长度。我需要将输入列表作为文件提供。有可能吗?

是的,只需将输入文件传递给-i选项:

ffmpeg -f concat -i concat.txt -c:v hevc_nvenc 1.mp4

concat.txt:

file '001.mp4'
file '003.mp4'

简单回答:这是可能的,但你可能会遇到其他限制。

可以使用FFmpeg的pattern_type"来实现大量图像的级联;序列";以及";glob";功能。可以使用concat文件连接其他介质。

但是,这些功能将所有文件聚集到一个连接的流中。如果您想在-filter_complex中将它们视为单独的输入,则需要不同的策略。也就是说,除了串联文件之外,任何人都不太可能使用一个有这么多输入的复杂过滤器(比如什么样的叠加、交织或混合可能涉及这么多文件?(。

为了简单起见,让我们使用为单个图像文件定制的drawtext过滤器(只需在每个图像上绘制文件号(:

ffmpeg -i 0.png -i 1.png -filter_complex "[0]drawtext=text=0[i0];[1]drawtext=text=1[i1];[i0][i1]concat=2" output.mp4

使用此格式,命令行长度将达到>在看到来自FFmpeg:的错误消息之前,在1000多个输入下为46k

1020.png: Too many open files

因此,对我来说,命令行长度并不是瓶颈(请注意,我使用的是Linux(。然而,如果我想缩短命令行,那么一个简单的步骤就是将复杂的过滤器移动到一个文件中:

ffmpeg -i 0.png -i 1.png -filter_complex_script script_file.txt output.mp4

这将相同的命令减少到11k+一个脚本文件。如果这还不够,那么下一步是用电影过滤器(amovie for audio(替换输入文件,如concat文档中所示。在这种情况下,script_file.txt看起来像:

movie=0.png,drawtext=text=0[i0];
movie=1.png,drawtext=text=1[i1];
[i0][i1]concat=2

命令只是:

ffmpeg -filter_complex_script script_file.txt output.mp4

movie/amovie过滤器不是输入的完美替代品(我遇到了这个非常小的错误(,但对于大多数用例来说已经足够接近了。

在任何情况下,这都无法绕过打开文件的限制,因此,如果您超过了这个限制,那么您可能必须生成包含最大文件数的视频片段,然后将这些片段连接到一个完整的视频中。

ffmpeg $(ls *.mp4 |sort|xargs -i echo -i {})

下载了许多.ts和.aac文件后,我只需使用cat将所有.ts文件放在一个大的.ts文件中和.aac文件一样然后我只使用ffmpeg来组合大的.ts和.aac文件

ffmpeg -i combined.ts -i combined.aac -c:v copy -c:a copy ouput.mp4

将命令行参数放在文本文件的每一行上。

ffmpeg @/path/to/textfile.txt > output.log

output.log文件将包含std-out。如果你只是想在屏幕上看到结果,你可以省略这个。

最新更新