12

目標は、単一のソース ファイルからビットレートのみが異なる複数の出力ファイルを作成することです。文書化されたこれに対する解決策は機能しましたが、非効率的でした。私が見つけた最も効率的な解決策は、私が見ることができるどこにも文書化されていませんでした。レビューのためにここに投稿し、実行できる追加の最適化を他の人が知っているかどうかを尋ねています.

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

この方法で潜在的な問題が発生する可能性があるか、より良い方法を知っている人はいますか?

4

2 に答える 2

4

最初のプロセスのパイプ出力にオーディオ/ビデオオプションを適用すると、3つのエンコーディングを1つのエンコーディングに交換するため、CPUを節約できます。

ffmpeg -i $INPUT_FILE -vf scale=720:-1,crop=720:400 $AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2  -f yuv4mpegpipe -\
    | ffmpeg -y -f yuv4mpegpipe -i - \
          -b:v 250k out-250.mp4 \
          -b:v 500k out-500.mp4 \
          -b:v 700k out-700.mp4

これは、古いバージョンのffmpegに推奨される方法です。今月初めから利用可能な新しい方法(テストしていません)があります:http://ffmpeg.org/trac/ffmpeg/wiki/Creating%20multiple%20outputs

于 2013-02-21T20:18:26.730 に答える