我需要在命令行上为 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“序列”和“全局”功能来连接大量图像。 可以使用 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 + 一个脚本文件。 如果这还不够,那么下一步就是用 movie 过滤器(amovie 对于音频)替换输入文件,如 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
电影/电影过滤器并不是输入的完美替代品(我遇到了这个非常小错误),但对于大多数用例来说已经足够接近了。
无论如何,这都无法绕过打开文件的限制,因此如果超过该限制,那么您可能必须生成包含最大文件数的视频片段,然后将这些片段连接成完整的视频。
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 文件将包含标准输出。如果您只想在屏幕上看到结果,可以省略此部分。
这可能比以文件形式提供输入要容易一些。一种可能的解决方案是创建一个小的 bash 脚本并将其和要转换的所有文件放入一个文件夹中,然后执行该脚本,它将对该文件夹中的每个文件执行 ffmpeg 命令,除了它自己和任何文件隐藏文件。例如,创建 bash 脚本文件,将所有音频文件转换为 aac 格式并压缩它们
perform_convert.sh
#!/bin/bash
# Get the script's own filename to exclude it
script_name=$(basename "$0")
# Loop through all files in the current directory
for file in *; do
# Check if it's not a hidden file and not the script itself
if [[ -f "$file" && "$file" != "$script_name" && "$file" != .* ]]; then
# Remove the extension from the filename
base_name="${file%.*}"
# Replace with your command
ffmpeg -i "$file" -b:a 64k -map a "${base_name}.aac"
fi
done
更改脚本的可执行权限
chmod +x perform_convert.sh
然后进入终端,
cd
进入您创建的文件夹并执行./perform_convert.sh