順番 - ffmpeg 使い方 初心者




複数のビットレートの出力ファイル用にffmpeg w/x264を最適化する方法 (2)

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

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 &

明らかな非効率性は、ソースファイルが各プロセスに対して同じように読み込まれ、デコードされ、拡大縮小され、そして切り取られることです。 どうすればこれを1回実行してから、その結果をエンコーダに送信できますか。

1つの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

誰もがこの方法でそれを行うことで潜在的な問題を見ますか、またはより良い方法を知っていますか?


最初のプロセスのパイプ出力にオーディオ/ビデオオプションを適用すると、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 : http://ffmpeg.org/trac/ffmpeg/wiki/Creating%20multiple%20outputs


私は、OPがもっと望んでいることは、フィルタを一度使用し、数回エンコードすることだと思います。 「tee」フィルタを使用するとより高速になるかもしれませんが、使用されている方法が優れています。最近のhttp://ffmpeg.org/trac/ffmpeg/wiki/Creating%20multiple%20outputsの最後に追加されたものも参照してください。同じ入力に対して "