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つ停止します。
一部のジョブが停止する理由に関する元の質問への回答では、コマンドラインの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は入力を検索せず、すべてのジョブがバックグラウンドで実行されます。
コマンドについて考えてみましょう。単一のコマンドでマシンをハンマーで打つはるかに簡単な方法は、すべてを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