我厌倦了并行运行 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