我可以并行运行多少个 FFmpeg 命令实例?

我可以并行运行多少个 FFmpeg 命令实例?

我厌倦了并行运行 8 个命令来充分利用 CPU 并加快视频转换速度,如下所示:

ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/a.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/b.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/c.mp4 > /dev/null 2>&1  &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/d.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/e.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/f.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60  -f mp4 /mnt/g.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4  /mnt/h.mp4 > /dev/null 2>&1 &

其中 2 到 3 个停止了。为什么会发生这种情况?这是 FFmpeg 的限制吗?我在 16 核和 4 核机器、EC2 c1.xlarge 和 cc2.8xlarge 上尝试过。行为相同。我尝试过复杂命令和简单命令,结果仍然一样,2 或 3 个停止了。

答案1

在回答最初的问题时,为什么有些作业会停止,命令行上的 ffmpeg 是交互式的。它不断在命令行上读取输入。为了让你在后台运行所有这些,你应该改变这一点:

ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/a.mp4 > /dev/null 2>&1 &

更改为:

ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/a.mp4 </dev/null > /dev/null 2>&1 &

添加</dev/null告诉 ffmpeg 不要寻找输入,并且所有作业都应该在后台运行。

答案2

只是对您的命令的一个想法:用单个命令敲击机器的一个更简单的方法是将所有内容连接成一行:

ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/a.mp4 \
 -f mp4 /mnt/b.mp4 \
 -f mp4 /mnt/c.mp4 \
 -f mp4 /mnt/d.mp4 \
 -f mp4 /mnt/e.mp4 \
 -f mp4 /mnt/f.mp4 \
 -f mp4 /mnt/g.mp4 \
 -f mp4  /mnt/h.mp4 > /dev/null 2>&1

您可能需要添加(取决于您的 ffmpeg 版本)一个标志来告诉服务器使用所有可用的处理器

-threads 0

以供参考:http://ffmpeg.org/trac/ffmpeg/wiki/Creating%20multiple%20outputs

相关内容