x264、x265、vpxのレート制御モードを理解する



Understand Rate Control Mode X264



元の: https://slhck.info/video/2017/03/01/rate-control.html
元の時間:2017.03.01
翻訳時間:2019.01.30

元のテキストは継続的に更新される可能性があります(最後のテキストは2018年8月でした)。ご不明な点がございましたら、原文をご確認の上、変更してください。



x264、x265、vpxのレート制御モードを理解する

「レートコントロール」とは何ですか?これは、ビデオエンコーダーが画像のフレームをエンコードするために使用するデータのビット数を決定する方法を指します。ビデオ損失(不可逆)の目的は、ソースビデオの品質を最小限に抑えながら、出力ファイルのサイズを最小限に抑えることです。レート制御は、ファイルサイズとビデオ品質を評価する上で重要なステップです。

レート制御はさまざまな形式で具体化されます。「1パス」と「2パス」、「CBR(固定コードレート)」と「VBR(動的レート)」について学習しますが、「VBVエンコーディング」(ビデオバッファチェッカー) 'または 「CRF(固定コードレート係数)」



なぜあなたはこれを気にする必要があるのですか?エラーレート制御モードまたはエラーコードレートを使用する十分なビデオエンコーディングコマンドをすでに見てきました。この記事は、エンドユーザーに適用可能なシナリオを説明するさまざまなレート制御モードの簡潔なガイドです。これは、レート歪み最適化の詳細な仕様ではないことに注意してください。

はじめに:動的ビットレートと固定ビットレート

多くの人、特に私のようなMP3で育った人は、オーディオエンコーダのレート制御に精通しているかもしれません。 CDをリッピングするために、動的レートコーディング(VBR)が登場するまで、エンコードに固定ビットレート(CBR)を使用しました。動的ビットレートにより、条件付き制限(VBR品質レベル)が与えられた場合に、可能な限り最小のファイルサイズと可能な限り最高のビデオ品質を実現できます。

簡単に言えば、VBRを使用すると、エンコーダーはビデオが簡単に圧縮される部分のデータスペースを節約し、「エンコードが難しいコンテンツ」のままにすることができます。圧縮の難しさを区別する方法は?たとえば、連続するビデオフレーム間のコンテンツの違いが大きくなるため、ビデオの可動部分のほとんどは、エンコード時に多くのデータスペースを必要とします。高い空間の詳細と複雑なテクスチャも同様にコーディングが困難です。



コーディングシーンとは何ですか?

どのレート制御モードを選択するかは、実際の使用例と強く関連しています。以下にリストされているさまざまなシナリオは、コーディングパイプラインを設計するときに行う選択に影響します。

  1. アーカイブ用 -圧縮ファイルは、外部デバイスまたはサイバースペースにアーカイブを保存するために使用されます。出力ファイルは、可能な限り小さいファイルサイズで可能な限り高くする必要がありますが、通常、現時点ではファイルの実際のサイズは気にしません。
  2. ストリームメディア -HTTPプログレッシブダウンロードやHTTPアダプティブストリーミングなどの一般的なビデオオンデマンド(VoD)ストリーミングソリューションで、ネットワークを介してファイルを転送するために使用されます。転送ファイルが特定のビットレートを超えないこと、または同じファイルの異なる再生形式に対して異なるビットレート設定を提供する必要があることを確認する必要があります( アダプティブフロー )。
  3. 生放送 -2と同様ですが、エンコードプロセスは可能な限り高速である必要があり、ライブシーンでメディアコンテンツに関する情報を事前に知ることはできません。
  4. 端末デバイスのエンコード -DVDやBlu-rayなどの他の端末デバイスでメディアファイルを再生するために使用されます。出力ファイルのサイズを固定したい場合があります。

つまり、実際のシナリオを理解することは、適切なレート制御モードを選択するのに役立ちます。


レート制御モード

それでは、いくつかの異なるモードに飛び込みましょう。囲みます x264x265libvpxffmpegこれらの人気のあるH.264およびH.265エンコーダーで利用できます。あなたは このリンク これらのエンコーダーでサポートされているパラメーターの詳細については、(ffmpeg libx264、libx264rgb)を参照してください。

x265の場合、コンパイル時にffmpegを追加する必要があります--enable-libx265、すべてのパラメーターをx265に直接渡すことができるわけではなく、構成する必要があります--x265-paramsオプション。 libvpxの場合、コンパイル時にffmpegを追加する必要があります--enable-libvpx

注意:x264のようなエンコーダーは、デフォルトではビデオフレームを不要なデータで厳密に埋めません。つまり、エンコードが単純な場合、最終的な出力レートは指定されたサイズよりも小さくなる可能性があります。エンコーダーの値。心配しないでください。念頭に置いてください。無駄がある場合、目標のビットレートを達成するためにコーディングしても意味がありません。

定数QP(CQP)

量子化パラメーターは、ビデオフレーム内の各マクロブロック(マクロブロック)の圧縮量を制御します。値が大きいほど、量子化された値が大きいほど、圧縮率が高くなり、品質が低くなり、値が小さいほど、反対の意味を表します。 H.264のQP範囲は0〜51です。x264およびx265では、エンコードプロセス全体に固定QP値を設定するだけです。注:libvpxは固定QPを設定できません。

ffmpeg -i -c:v libx264 -qp 23 ffmpeg -i -c:v libx265 -x265-params qp=23

読める このチュートリアル QPの背後にある原則を理解する(これらの数式を恐れていない場合)。

QPが必要なものを正確に理解していない限り、 それ以外の場合は、このモードを使用しないでください。 固定QPを設定すると、最終的なコードレートは各コンテンツシーンの複雑さに応じて劇的に変化し、入力ビデオのコーディングが非効率的になります。これはデータスペースの浪費を引き起こす可能性があり、出力ファイルの実際のコードレートを把握することはできません。

に適し :ビデオコーディング研究
適用できません :他のほとんどすべてのシーン

各コンテンツシーン分類に対して最適なコーディング結果を達成するために、Netflex 固定QPコーディングの使用を提案 ショットごとのエンコーディング手法を最適化するため(この記事のチャンクからショットまでのセクションでは、「ショット」とは何かについて説明しています)。ただし、これには多くの計算能力が必要であり、個別にコード化された各ショットを注意深く区別する必要があるため、固定QPは「1つのサイズですべてに対応」するアプローチではありません。その前に、それをサポートするためのフレームワークの完全なセットを実装する必要があります。

アダプティブコードレート(ABR)

ここでは、エンコーダーの目標ビットレートを設定し、このビットレートを達成する方法をエンコーダーが知っていることを期待します。

ffmpeg -i -c:v libx264 -b:v 1M ffmpeg -i -c:v libx265 -b:v 1M ffmpeg -i -c:v libvpx-vp9 -b:v 1M

このモードは使用しないでください。 x264の主要な開発メンバーの1つ 私はあなたがそれを使用してはならないと言いました。 。どうして?エンコーダーは後で何が起こっているのかを正確に知ることができないため、ターゲットのビットレートに到達するために推測に依存する必要もあります。これは、コードレート自体が、特にビデオの冒頭で変動し、ある時点でターゲットに到達することを意味します。特にHASタイプ(これは何ですか?)のストリーミングメディアの場合、短いセグメント間で品質が大幅に変化します。

この しない 固定ビットレートモードです! ABRは技術的にはVBRモードですが、出力の安定した画質の信頼性が良くないため、固定ビットレートを指定するよりもはるかに優れています。

に適し :緊急時の計画
適用できません :ほぼすべてのシーン。 。

固定ビットレート(CBR)

ユースケースの要件である場合は、それを開くことができます。nal-hrdこのオプションは、エンコーダーに常に特定のビットレートを使用するように強制します。

ffmpeg -i -c:v libx264 -x264-params 'nal-hrd=cbr:force-cfr=1' -b:v 1M -minrate 1M -maxrate 1M -bufsize 2M

MP4はNALパディングをサポートしていないため、このメソッドの出力ファイルは.ts Format(MPEG-2 TS)である必要があります。入力ファイルのエンコードが簡単な場合は、 このモードは帯域幅の浪費を引き起こします 、ただし、ストリーミングメディア全体でコードレートが変更されないことを保証できます。できる この 記事のその他のポイントを参照してください。 CBRモードは一部のアプリケーションで機能する場合がありますが、ストリーミングメディアでは、コードレートをできるだけ低く保つ必要があることがよくあります。

VP9での使用方法:

ffmpeg -i -c:v libvpx-vp9 -b:v 1M -maxrate 1M -minrate 1M

に適し :単に固定ビットレート(量..ok〜)のビデオストリーミングを維持するため(例: けいれん )。
適用できません :帯域幅の効率的な使用を必要とするアーカイブシナリオ

二次コード適応コードレート(2パスABR)

2番目(またはそれ以上)のエンコーディングにより、エンコーダはビデオコンテンツを推定できます。最初のエンコードは、画像の各フレームをエンコードするオーバーヘッドを計算し、2番目のエンコードでデータスペースをより効率的に使用します。これにより、特定のレート制限で出力品質が最高になります。

ffmpeg -i -c:v libx264 -b:v 1M -pass 1 -f mp4 /dev/null ffmpeg -i -c:v libx264 -b:v 1M -pass 2 .mp4

x265の場合、libx264 libx265に置き換えられました次に、対応するパラメータでエンコーディングの数を設定します。

ffmpeg -i -c:v libx264 -b:v 1M -x265-params pass=1 -f mp4 /dev/null ffmpeg -i -c:v libx264 -b:v 1M -x265-params pass=2 .mp4

VP9とx264は同様の方法で使用されます。

ffmpeg -i -c:v libvpx-vp9 -b:v 1M -pass 1 -f webm /dev/null ffmpeg -i -c:v libvpx-vp9 -b:v 1M -pass 2 .webm

ストリーミングシナリオでは、これがビデオファイルをエンコードする最も簡単な方法です。注意すべき点が2つあります。最終的なビデオの品質がわからないため、設定されたビットレートがこれらの複雑なコンテンツに十分であることを確認するためにテストを行う必要があります。このモードの悪影響は、ビットレートがローカルであること。ピーク値により、ストリーミングメディアを受け入れるとき、ピーク間隔中にクライアントにプレッシャーまたは容量不足が発生します。コードレート値の選択については、 Youtubeはいくつかの提案をします ユーザーができるだけ多くアップロードできるようにするため 高い 高品質のビデオ、これらの値は最適化されており、実際の使用ではより低いビットレートを選択することもできます。

に適し :端末デバイスをエンコードする特定のターゲットビットレートでファイルを出力します
適用できません :コーディング速度の要件が高いシーン(ライブストリームなど)

固定品質(CQ)/固定レート係数(CRF)

これについては別の記事で詳しく説明しました。 固定金利係数 。一般に、コーディングプロセス全体で一貫した品質を提供します。これは「万能」アプローチです。CRF値を指定するだけで、残りはエンコーダーに任せることができます。

ffmpeg -i -c:v libx264 -crf 23 ffmpeg -i -c:v libx265 -crf 28 ffmpeg -i -c:v libvpx-vp9 -crf 30 -b:v 0

H.264およびH.265では、CRFの範囲は0〜51(QPと同じ)です。 x264のデフォルト値は23、x265のデフォルト値は28です。設定18(またはx265を24に設定)は目立ち、値を低くするとスペースが無駄になる可能性があります。 +6の値はコードレートを半分に減らし、-6はコードレートを2倍にします。 VP9のCRF範囲は0〜63です。CRFの推奨範囲は15〜35です。

CRFモデルの唯一の悪影響は、出力ファイルのサイズやレートの変動がわからないことです。

2パスエンコーディングとCRFエンコーディングは、同じビットレートで同じビデオ品質を備えています。主な違いは、2パスでは、必要に応じて出力ファイルのサイズを直接制御できることです。対照的に、CRFの出発点は、必要な品質のレベルを設定することです。

に適し :保管条件で許可されている最高品質をアーカイブする
適用できません :ストリーミングメディア出力固有のビットレート/ファイルサイズ

制限付きコーディング(VBV)

ビデオバッファリングベリファイア 最大ビットレートの制御を実現する方法を提供します。これは、端末デバイスが受信したデータの量が特定の期間(ピークレートなど)に知覚範囲を超えないかどうかを判断できるため、ストリーミングメディアに役立ちます。 VBVは、2パスVBR(両方のエンコーディングのVBR)またはCRFエンコーディングで使用できます。上記のレート制御モードに「追加」できます。後者の使用法は、「制約付き/上限付きCRF」とも呼ばれます。

パス-maxrate最大ビットレートを設定します-bufsize VBVをオンにするために、必要なサイドキャッシュサイズを設定します。

ffmpeg -i -c:v libx264 -crf 23 -maxrate 1M -bufsize 2M ffmpeg -i -c:v libx265 -crf 28 -x265-params vbv-maxrate=1000:vbv-bufsize=2000

VP9にも同様のパターンがありますが、VBVとは呼ばれていませんが、効果は同じです:

ffmpeg -i -c:v libvpx-vp9 -crf 30 -b:v 2M

注:ライブストリーミングアプリでVBVを有効にしている場合、x264 x265で追加可能-tune zerolatency -preset ultrafastでエンコード速度を向上させるため。これらの2つの設定は、特定のコードレート(圧縮効率)を達成するために出力ビデオの品質を低下させますが、エンコード速度を大幅に向上させます。正解libvpx-vp9設定する必要があります-quality realtime -speed 5で。詳細情報を見ることができます H.264VP9 ガイダンス文書。

制約付きABR-VBVエンコーディングを使用します。

ffmpeg -i -c:v libx264 -b:v 1M -maxrate 1M -bufsize 2M -pass 1 -f mp4 /dev/null ffmpeg -i -c:v libx264 -b:v 1M -maxrate 1M -bufsize 2M -pass 2

x265の場合:

ffmpeg -i -c:v libx265 -b:v 1M -x265-params pass=1:vbv-maxrate=1000:vbv-bufsize=2000 -f mp4 /dev/null ffmpeg -i -c:v libx265 -b:v 1M -x265-params pass=2:vbv-maxrate=1000:vbv-bufsize=2000

VP9の場合:

ffmpeg -i -c:v libvpx-vp9 -b:v 1M -maxrate 1M -bufsize 2M -pass 1 -f webm /dev/null ffmpeg -i -c:v libvpx-vp9 -b:v 1M -maxrate 1M -bufsize 2M -pass 2

注:x264開発者によると、ここでは1パスを使用できます。 2パスと同じにすることができます ただし、圧縮効率が一致しない場合があります。

bufsizeを設定する方法は?それはあなたが受け入れることができるビットレートの変動性に依存します。簡単なルールは、キャッシュサイズを最大ビットレートの2倍に設定することですが、このアドバイスはストリーミングメディアの他の構成によって異なります。クライアントのバッファが小さい場合(たとえば、数秒のみ)、bufsizeは最大レートとほぼ同じサイズに設定する必要があります。ストリーミングメディアのビットレートを制限する場合は、bufsizeを最大ビットレートの半分以下に設定してみてください。

VBVまたはCRFエンコーディングを使用する場合の秘訣は、必要な最大ビットレートを超えないCRF値を見つけることです。コーディングスキームで、出力ファイルが目的の最大コードレートを「完全に超える」ことが多い場合は、CRF設定が低すぎる可能性があります。その場合、エンコーダーは割り当てられていないデータを使用しようとします。スペース。一方、CRFが高く設定されていて、出力ファイルが最大ビットレートに到達しないことが多い場合は、CRFを下げ続けて、より高い品質を実現できます。例:コーディングスキーム オンになっていない VBV、CRF = 18に設定すると、平均出力ファイルレートは3.0 Mbit / sですが、VBV設定を追加して1.5 Mbit / sに制限したい場合は、コードレートの半分だけを取得するためにCRFを約24に減らす必要があります。

に適し :帯域幅が制限されたストリーミングメディアライブストリーミング(1パス、CRF)VoDストリーミング(指定されたビットレート、2パス)
適用できません :アーカイブのための単純でランダムなコーディングの試み


比較例

以下は、異なるレート制御モード間の簡単な比較です。私は自由です ビッグバックバニー鋼の涙 ビデオシーケンスでは、3つの異なるセグメント(30秒の長さ)が選択されています。これらのビデオシーケンスは、圧縮されていない元の記録バージョンであり、ビデオのセグメント化に使用されます。libx264デフォルトの設定コードによると、比較の唯一の違いはレート制御方法です。さまざまなターゲットビットレート(750、1500、3000、7500 kbit / s)、最大ビットレート(VBV)、QP / CRF(17、23、29、35)を設定しました。これらはGithubで表示できます 比較スクリプト

この比較は、あまり詳細ではなく、完全に代表的なものでもないことに注意してください。通常、コロケーションテストでは、さまざまな種類のビデオシーケンスとさまざまなエンコーダを試す必要があります。近い将来、これらのテストを更新する予定ですが、今のところ、次のテストでさまざまなモードに関するアドバイスを提供します。

次の図では、左の列は3000 kbit / sで、右の列は7500 kbit / sです。他の2つのターゲットビットレートは表にあまり違いがないため、これら2つのビットレートのみを保持します。すでに非常に低いコードレートに直面している場合、エンコーダにはあまり多くのデータ割り当てがありません。選択する。各行は、Big Buck Bunny(BBB)とTears of Steel(ToS)のフラグメントです。表の線は、各フレームがLOESSによって平滑化された後の結果の曲線を示しています。これは、ビデオセグメンテーションの時間とともにコードレートがどのように変化するかを示しています。

画像

特に最初の4つのセグメントであるABR(シアン)とABR + VBV(紫)は、ビデオセグメンテーションの複雑さを誤って推定していることがわかります。実際、BBBビデオシーケンスの最初は、動画がほとんどない段階的で滑らかなグラデーションです。つまり、十分な品質に圧縮するために、多くのデータスペースを必要としません。 2パス方式は、より低いビットレートで正しく開始され、帯域幅を節約します。最後から3番目のセグメントには多くの空間詳細が含まれており、2パスモードでは、最初に保存されたデータスペースをこれらの詳細に使用できます。

BBBの2番目のビデオセグメントでは、さまざまなエンコードモードが実際に予想よりも優れたパフォーマンスを示しましたが、2パスモードでは他のモードよりもコードレートの変動が大きくなることがわかります。

もちろん、コーディングが簡単な(またはコンテンツの複雑さの変動が少ない)ビデオセグメントもあります。これらのセグメントでは、さまざまなレート制御モードに多くの違いはありません。

ビデオ品質(CQPおよびCRF)に焦点を当てたモードについては、CRF / QP 17および23の結果のみを示します。この範囲は、ほぼ「より良い」品質範囲(3000〜7500 kbit /など)です。 sは、フルHDビデオの「より良い」レート範囲です。ここでの曲線の順序は逆になっています。CRFが低いほど、品質は高くなります。

画像

2パスを組み合わせた後も同じ傾向が見られます。コードレートはコンテンツの複雑さによって異なります。 CRFを使用する場合、不要な場所でデータスペースを節約するために、コードレートの選択がより制限されます。最も興味深い例は左下隅です。CRFは他の例のConstantQPよりも一般的に効率的ですが、最初から最後までほぼ安定したギャップを維持します。私はこれが起こっている理由を推測することしかできません-私はこの記事の後のアップデートでそれを分析するかもしれません...

一般に、出力の平均ビットレートを事前に判断できる限り、CRFモードがコンテンツの適応に適していることがわかります... CRF + VBVのパフォーマンスは次のとおりです。

画像

特定のCRF値に対して適切なターゲットレート/最大コードレートを選択することは、常に推測の問題であり、ソースビデオのコンテンツによって異なります。いずれの場合も、この適切な正しい値が見つかった場合、ビデオ品質を非常に極端なレベルに制限することはありません(3000 kbit / sやCRF17の例など)。また、コードレートが大きく変動することは望ましくありません。CRF23はlibx264です。デフォルトでは、適切なターゲットビットレート(7500 kbit / sなど)が設定されている場合、このエンコーディングにより、レートの変動性を複雑なコンテンツの違いに適切に適合させることができます。 VBVモデルは保持されます。

総括する

さまざまなレート制御モードを理解するのは簡単ではありません。残念ながら、最も単純なソリューションが推奨されますが(固定レート値のみが指定されます)、インターネット全体がこのアプローチを使用するコードサンプルを配布し続けます。

一般に、独自の使用シナリオに基づいて、次の選択を行うことができます。

  1. アーカイブ-CRFモードでは、必要なビデオ品質を得ることができます。
  2. ストリーミングメディア-2パスCRFまたはABRとVBV
  3. ライブストリーミング-1パスまたはABRとVBV、またはCBR(帯域幅の冗長性が許容できる場合)
  4. 端末デバイスのエンコード-2パスABR

より詳しい情報:


更新:

  • 2018年8月-詳細の更新、リンクの追加
  • 2018年3月–シーンごと/ショットごとのエンコーディングに関連するリンクを追加
  • 2017年11月-libvpx / VP9の手順を追加しました
  • 2017年11月– x265 2パスのエラーの例を変更し、bufsizeの説明を追加しました
  • 2017年6月–x265のデフォルトCRFの説明を追加
  • 2017年4月–libx265の2パスオプションのエラーの説明を変更