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

d33*_*ika 21 ffmpeg multi-processor multi-core

我厌倦了并行运行 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 &
Run Code Online (Sandbox Code Playgroud)

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

小智 24

在回答原始问题时,至于为什么某些作业停止,命令行上的 ffmpeg 是交互式的。它不断读取命令行上的输入。为了让您在后台运行所有这些,您应该更改以下内容:

ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/a.mp4 > /dev/null 2>&1 &
Run Code Online (Sandbox Code Playgroud)

对此:

ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/a.mp4 </dev/null > /dev/null 2>&1 &
Run Code Online (Sandbox Code Playgroud)

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

  • @Mr.Hyde 迟到了我知道的聚会,但是 2&gt;&amp;1 告诉错误流与粗壮流转到同一位置 - 所以 /dev/null。它是 `&gt; /dev/null 2&gt;/dev/null` 的简写。 (4认同)

Nub*_*aII 8

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

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
Run Code Online (Sandbox Code Playgroud)

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

-threads 0
Run Code Online (Sandbox Code Playgroud)

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

  • 也许它与EC2机器有关?我只是在具有 16 个输出的 16 xeon 核心机器上运行上述命令,这就是我得到的:[htop 屏幕截图](http://img841.imageshack.us/img841/6403/ffmpeg.jpg) (2认同)