web-dev-qa-db-ja.com

FFmpegコマンドのインスタンスをいくつ並列で実行できますか?

CPUをフルに活用してビデオ変換を高速化するために、次のような8つのコマンドを並行して実行することに疲れました。

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つ停止します。

18
d33pika

一部のジョブが停止する理由に関する元の質問への回答では、コマンドラインの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は入力を検索せず、すべてのジョブがバックグラウンドで実行されます。

21
DingoNV

コマンドについて考えてみましょう。単一のコマンドでマシンをハンマーで打つはるかに簡単な方法は、すべてを1行に連結することです。

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

7
NublaII