我需要在命令行上为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。如果你只是想在屏幕上看到结果,你可以省略这个。