目標は、単一のソース ファイルからビットレートのみが異なる複数の出力ファイルを作成することです。文書化されたこれに対する解決策は機能しましたが、非効率的でした。私が見つけた最も効率的な解決策は、私が見ることができるどこにも文書化されていませんでした。レビューのためにここに投稿し、実行できる追加の最適化を他の人が知っているかどうかを尋ねています.
Source file MPEG-2 Video (Letterboxed) 1920x1080 @>10Mbps
MPEG-1 Audio @ 384Kbps
Destiation files H264 Video 720x400 @ multiple bitrates
AAC Audio @ 128Kbps
Machine Multi-core Processor
各ビットレートでのビデオ品質は重要であるため、「中」プリセットを使用して 2 パス モードで実行しています。
VIDEO_OPTIONS_P2 = -vcodec libx264 -preset medium -profile:v main -g 72 -keyint_min 24 -vf scale=720:-1,crop=720:400
最初のアプローチは、それらすべてを並列プロセスでエンコードすることでした
ffmpeg -y -i $INPUT_FILE $AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2 -b:v 250k -threads auto -f mp4 out-250.mp4 & ffmpeg -y -i $INPUT_FILE $AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2 -b:v 500k -threads auto -f mp4 out-500.mp4 & ffmpeg -y -i $INPUT_FILE $AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2 -b:v 700k -threads auto -f mp4 out-700.mp4 &
明らかな非効率性は、ソース ファイルが各プロセスで同じように読み取られ、デコードされ、スケーリングされ、トリミングされることです。これを一度実行してから、エンコーダーに結果をフィードするにはどうすればよいでしょうか?
単一の ffmpeg コマンドですべてのエンコードを生成すると、重複する手順が最適化されることが期待されていました。
ffmpeg -y -i $INPUT_FILE \
$AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2 -b:v 250k -threads auto -f mp4 out-250.mp4 \
$AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2 -b:v 500k -threads auto -f mp4 out-500.mp4 \
$AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2 -b:v 700k -threads auto -f mp4 out-700.mp4
ただし、エンコード時間は、以前のマルチプロセス アプローチとほぼ同じでした。これにより、すべてのステップが再び重複して実行されていると思われます。
ffmpeg に読み取り、デコード、およびスケーリングを 1 回だけ実行させるために、これらの手順を 1 つの ffmpeg プロセスに入れ、その結果をエンコードを実行する別の ffmpeg プロセスにパイプしました。これにより、全体の処理時間が 15% ~ 20% 改善されました。
INPUT_STREAM="ffmpeg -i $INPUT_FILE -vf scale=720:-1,crop=720:400 -threads auto -f yuv4mpegpipe -"
$INPUT_STREAM | ffmpeg -y -f yuv4mpegpipe -i - \
$AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2 -b:v 250k -threads auto out-250.mp4 \
$AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2 -b:v 500k -threads auto out-500.mp4 \
$AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2 -b:v 700k -threads auto out-700.mp4
この方法で潜在的な問題が発生する可能性があるか、より良い方法を知っている人はいますか?