FFmpeg 3パスビデオエンコーディング

序文

最初に、論文「VBR エンコードされたビデオの ABR ストリーミング: 特性、課題、および解決策」(CoNext'18) の「「3 パス」エンコード手順」を目にしました。非常に包括的な情報です。その後、FFmpeg と H.264 エンコードについて理解し、上で引用した Netflix のオリジナル記事「実用的な VOD アプリケーションのための x264、x265、および libvpx の大規模ビデオ コーデックの比較」を読んで、徐々に答えを理解しました。必要な人が参照できるように、この記事にマークを付けます。


3パスエンコーディングとは何ですか?

H.264 ビデオ コーディングを例に挙げると、通常は 2 パス コーディングがより一般的に使用されます。例えば:

では、3パスエンコーディングとは何でしょうか?
3 パス エンコーディングについては、Netflix が論文で説明しています (一般的な目的のために、わずかに変更されています)。

  • 最初のステップでは、各クリップはCRF (x264/x265) または定数 QP (libvpx) 値を使用してエンコードされます。
  • 2 番目のステップでは、ステップ 1 の出力ビットレートを使用して2 パス VBR エンコードが実行されます。

H.264 ビデオの場合:

  • 最初のステップでは、CRF を使用してエンコードします。
  • 2番目のステップでは、1番目のステップで取得したビデオのビットレートを目標ビットレートとして使用し、2パスエンコードを実行します。

言い換えれば、3 パス エンコーディングは、実際には 2 パス エンコーディングの前の CRF エンコーディングのステップです。

3パス = CRF + 2パス

※CRFとは何か、QPとの違いについては、「CRFとQPの違い」
をご参照ください。 ※簡単に説明すると、CRFは映像コンテンツに応じてエンコードに必要なQPパラメータを調整することで、エンコード後の映像品質を安定させることができます
※ H.264 の場合、CRF のデフォルト値は 23 です。さらに、Netflixは論文の中で8つのCRF基準値、すなわち15、19、23、27、31、35、39、43を指定しました。


なぜ 3 パス エンコーディングを使用するのでしょうか?

3 パスとは何かという疑問を解決した後は、なぜ 3 パス エンコーディングを使用するのか、疑問に思わずにはいられません
引き続き、論文内の Netflix の説明をご覧ください。

  • コンテンツに適応した方法でビットレートを決定するために、次の (「3 パス」) 手順が使用されました。
  • この手順により、簡単なクリップに対するビットレートの過剰割り当てや複雑なクリップに対する過小割り当てを回避しながら、2 パス レート制御の恩恵を受けることができます。

実際、これは 3 パス エンコーディングの 2 つの部分から考えることができます。CRF はコンテンツ認識の達成、つまりビデオ品質の確保に使用されます。2 パスはビット レートの制御、単純なビット レートの圧縮に使用されます。シーンを分割し、複雑なシーンのビット レートを向上させます。したがって、3 パス エンコーディングの目標は、ビデオ品質を確保しながらビット レートを合理的に割り当てることです。


3パスエンコーディングを行うにはどうすればよいですか?

元のビデオとして Elephant Dream 1080p を選択します ( DSAH ビデオ システム (サーバーおよびプレーヤー) の構築を参照)。3 パス エンコードの手順は次のとおりです。

step1 : CRF を使用して元のビデオをエンコードします (デフォルト値は 23)
参考: CRF ガイド (x264、x265、および libvpx の定レート係数)

ffmpeg -i elephants_dream_1080p24.y4m -s 1920x1080 -c:v libx264 -crf 23 -an tmp1920x1080.mp4

*注意: y4m にはオーディオがないようです。オーディオをエンコードしないためにこれを使用します。出力情報
によると、取得されたビデオ ビット レートは次のとおりです: 3664.85kbpsffmpeg

step2 & step3 : step1で取得したビデオビットレートを使用して、ビデオに2パスエンコードを実行します
(私の理解が正しければ、元のビデオに2パスエンコードを行うはずです)

ffmpeg -i elephants_dream_1080p24.y4m -s 1920x1080 -c:v libx264 -b:v 3665k -pass 1 -an -f mp4 /dev/null && \
ffmpeg -i elephants_dream_1080p24.y4m -s 1920x1080 -c:v libx264 -b:v 3665k -pass 2 -an out1920x1080.mp4

※注意:これはUbuntuでの書き方です、Windowsでは/dev/nullに変更してNUL置き換える必要がありますこれで3パスビデオエンコードが完了しました\^

※tmp1920x1080.mp4とout1920x1080.mp4の動画を同時に再生しましたが、1回のエンコードで得られた動画の方が3パスよりも鮮明に感じられるのはどうしてなのでしょうか…。

おすすめ

転載: blog.csdn.net/LvGreat/article/details/103536196