VP9 ビットレート モードの詳細

はじめに

基本エンコードのページでは、ビットレート モードの概要について説明していますが、CQ(制約付き品質)モードのみを対象としています。

このドキュメントでは、さまざまなシナリオに合わせて VP9 ビットレートを調整するその他の実用的な方法について詳しく説明します。次の例では、FFmpeg を使用しています。

圧縮

VP9 などの動画圧縮技術は、エンドユーザーにわかりやすい画像と動きの感覚を伝えるために必要なデータ量を削減することを目的としています。

これを実現するために使用される重要な手法の 1 つが量子化です。量子化器は、画像のさまざまなデジタル化された要素を数学的に簡略化します。たとえば、使用される色の範囲を縮小し、さらにデータに対して数学関数を実行して、縮小された色の範囲内の解像度の不足を「平滑化」する場合があります。このような関数は数多くあります。

量子化(または「Q」)については、Wikipedia の記事で詳しく説明されています。

VP9 では、変換係数に対して量子化が行われます。これにより、エンコードに追加することで、知覚品質を維持するために必要なビットレートが削減されます。

最終的に、量子化が多い(Q 値が高い)ほど、詳細が失われ、品質は低下しますが、フレームの保存に必要なデータは少なくなります。ほとんどの場合、VP9 エンコーダは、各フレームの複雑さに応じて Q を時間とともに変化させることで、ビットレートの目標を達成します。

ユースケースの最適化

ユーザーが VP9 圧縮を特定のニーズに合わせて調整できるように、初期圧縮時に、いくつかのプログラミング インターフェースを介して品質とビットレートのバランスを調整できます。

エンコーダには、速度、品質、ビットレートのトレードオフを調整するスライダーがあります。

  • 品質を重視する場合は、エンコード時間が長くなるか、より高速で豊富な処理リソースを用意する必要があります。

  • 出力 VP9 エンコード ファイルを小さくして迅速に配信することに重点を置く場合は、量子化ツールで画像を処理できる時間を短縮する必要があります。これにより、量子化ツールで処理できる詳細度が低下します。

  • ユーザーが配信速度のみを重視している場合(ライブ ウェブキャストや双方向のビデオ会議など)、量子化は、ネットワーク経由で伝送できるデータの使用可能なバイト数(つまり「ビットレート」)の制約に完全に従属する可能性があります。

適切な選択は、各ユースケースに大きく依存します。このバランスをユースケースに合わせて調整しやすくするため、VP9 では 4 つの「ビットレート モード」で簡単な構成がサポートされています。

VP9 ビットレート モード

まず、VP9 がサポートする主なビットレート モードを見てみましょう。

モード
定数量子化(Q) 固定量子化値を指定できます。ビットレートは変化します
制約付き品質(CQ) 最大品質レベルを設定できます。ビットレート パラメータ内で品質にばらつきが生じる可能性がある
可変ビットレート(VBR) ビットレートの制約内で、品質とビットレートのバランスを時間とともに調整する
固定ビットレート(CBR) 品質は変化するが、ビットレートをほぼ一定に保とうとする

Q

Q モードのグラフ

定数量子化モードは、ファイルサイズとビットレートが最終的な品質に完全に従属するシナリオに適しています。

Q 設定のユースケースは、デジタル シネマ、デジタル編集スイート、デジタル サイネージ アプリケーションなどです。これらのアプリケーションでは、コンテンツが物理ストレージ メディアまたは無制限の時間にわたって配信されるため、コンテンツが実際に使用されるよりもかなり前に配信され、望ましい出力は最高の画質でなければなりません。

VP9 Q モードのビットレート最適化

Constant Quantizer モードでは、最小限の構成が必要です。名前のとおり、Q モードは量子化器を目標の「品質」レベルに維持することに重点を置き、量子化器が処理したいデータのフローを決定できるようにします。ユーザーが定義する必要があるのは、目標品質のみです。

画像処理に重点を置いた(ビットレートに重点を置かない)ターゲット品質の詳細については、基本的なエンコードの記事をご覧ください。

Q モードのビットレート最適化には、次の FFmpeg コマンドライン パラメータを使用します。

ffmpeg
-b:v 0 動画のビットレートを 0 とマークすることで、「Q」モードを明示的に設定します。
-g <arg> キーフレーム間隔をフレーム単位で設定します(デフォルトは 240)。
-crf <arg> 最大品質レベルを設定します。有効な値は 0 ~ 63 です。数値が小さいほど品質が高い
-quality good -speed 0 ほとんどのアプリケーションでデフォルトかつ推奨される設定です。best-quality good -speed 0 からの改善はわずかですが、リサーチツールとしての機能が強化されています。
-lossless ロスレスモード

Q モードのビットレート : FFmpeg の例

最初の例は非常に極端な Q モードの設定であり、説明のみを目的として提供されています。(これらの例の 120 秒のクリップを処理する場合でも、数時間かかります。また、生成される出力ファイルは通常、元のソースよりもはるかに大きくなります)。

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -g 1 -b:v 0 -crf 0 -quality good \
  -speed 0 -lossless 1 -c:a libvorbis Q_g_1_crf_0_120s_tears_of_steel_1080p.webm.webm

-crf の効果を比較するため、次の例では -crf のみを変えています。-g は定義されていないため、デフォルトで 240 になります。また、実際には -crf はデフォルトで 10 になるため、3 つの例のうち 2 つ目の例でいずれのパラメータも指定しなくても、同じ結果が得られます。

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 0 -crf 0 -quality good \
  -speed 0 -c:a libvorbis Q_crf_0_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 0 -crf 10 -quality good \
  -speed 0 -c:a libvorbis Q_crf_10_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 0 -crf 63 -quality good \
  -speed 0 -c:a libvorbis Q_crf_63_120s_tears_of_steel_1080p.webm

これらの例の出力は、ディスク上のサイズが異なります。-crf0 に設定するとファイルは 711.8 MB、-crf10 に設定するとファイルサイズは 125.3 MB、-crf63 に設定するとファイルは 4.5 MB になりました。これは、-crf 引数の値を大きくすることで、結果として得られる VP9 エンコード ファイルの品質を下げたことを示しています。すべての出力ファイルの完全な概要は、下の結果の表にあります。

次に、-g 設定を変更した場合の影響を比較します。

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -g 1 -b:v 0 -quality good \
  -speed 0  -c:a libvorbis Q_g_1_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -g 240 -b:v 0 -quality good \
  -speed 0 -c:a libvorbis Q_g_240_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -g 480 -b:v 0 -quality good \
  -speed 0 -c:a libvorbis Q_g_480_120s_tears_of_steel_1080p.webm

-g 1 設定では、25.9 MB という非常に大きなファイルが生成されます。-g 240(デフォルトと同じ値を明示的に設定)に変更した場合、4.5 MB のファイルになります。-g 480 に変更した場合、4.4 MB のファイルになります。

CQ

CQ は、ファイルベースの動画におすすめのモードです。

CQ モードのグラフ

ほとんどのコンテンツ タイプでは、ビットレート上限付きの制約付き品質(CQ)モードを使用することをおすすめします。ほとんどの動画には、動きの激しいシーン(アクション シーケンスなど)と、詳細の少ないシーン(会話など)が混在しています。CQ モードでは、エンコーダは、長くて簡単なシーンでは妥当な品質レベルを維持し(ビットを無駄にせず)、難しいシーケンスにはより多くのビットを割り当てることができます。

ただし、上限範囲を指定してプロセスを制約する必要があります。そうしないと、圧縮がまったく行われない可能性があります。下限を設定することもできます。この場合、画像が黒でエンコード プロセスがほとんど何も行わなくても、データをスループットします。効率は低下する可能性がありますが、最終的には黒が大幅に圧縮されず、「非常に黒い」画像になります。

また、量子化しきい値も設定する必要があります。VP9 では、量子化しきい値を 0 から 63 まで変更できます。

CQ モードでは、次の FFmpeg コマンドライン パラメータが使用されます。
ffmpeg
-b:v <arg> 目標ビットレートを設定します(例: 500k)
-minrate <arg>
-maxrate <arg>
最小ビットレートと最大ビットレートを設定します。
-crf <arg> 最大品質レベルを設定します。有効な値は 063 です。数値が小さいほど品質が高くなります。
CQ ビットレート モード: FFmpeg の例

最初の例では、かなり広い制約が指定されています。ただし、上記の Q の例と比較すると、ビットレートがより高い範囲に強制的に設定され、出力品質が著しく高くなっています。ファイルサイズが著しく大きくなります。

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 1000k -maxrate 4000k -crf 10  -c:a libvorbis \
  CQ_4000_1000_crf_10_120s_tears_of_steel_1080p.webm

このインスタンスの出力ファイルはディスク上で 20.2 MB でした。これは、上記の例の Q モードのエンコードよりもかなり小さいです。

次の例では、ビットレートをより厳密に定義された範囲に制限しています。

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 1500k -maxrate 2500k -crf 10  -c:a libvorbis \
  CQ_2500_1500_crf_10_120s_tears_of_steel_1080p.webm

この例では、出力ファイルのサイズは 24.1 MB でした。複雑な動きが多い場面では、前の例と比較して動画の画質が明らかに低下しています。

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 1000k \
  -minrate 750k -maxrate 1400k -crf 10  -c:a libvorbis \
  CQ_1400_750_crf_10_120s_tears_of_steel_1080p.webm

この最後の例では、出力のサイズが大幅に縮小され、ディスク上で 13.2 MB になりました。

VBR

動きの激しいコンテンツ(スポーツなど)のビデオ オンデマンド ファイルをストリーミングする場合は、可変ビットレート モード(VBR)をおすすめします。HTTP ベースの配信に適しています。

VBR モードのグラフ

VBR モデルでは、アクション シーンは「簡単な」シーンよりも高いビットレートでエンコードされることがあります。これはキーフレームと一致しています。

大規模なストリーミング配信モデルの場合、VBR のメリットは配信とインフラストラクチャの両面で大幅に増加します。同じインフラストラクチャで多くの VBR ストリームが配信されている場合、システムを使用しているすべての視聴者にメリットがあります。

VP9 VBR は、スポーツなど動きの多いコンテンツのエンコードにも推奨されます。このような複雑性の高いコンテンツの場合、VBR は動きの少ない期間に高品質を実現します。

VBR モードでは、次の FFmpeg コマンドライン パラメータが使用されます。
ffmpeg
-quality good good 品質はビデオ オンデマンドに適しています
-speed <arg> VIDEO ON DEMAND の有効な値は 0 ~ 5 で、0 が最高品質、5 が最低品質です。(ライブ配信の場合、範囲は 5 ~ 9 です。下記の CBR を参照してください)。
VBR ビットレート モード: FFmpeg の例
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 1500k -maxrate 2500k -quality good -speed 0  -c:a libvorbis \
  VBR_good_0_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 1500k -maxrate 2500k -quality good -speed 5  -c:a libvorbis \
  VBR_good_5_120s_tears_of_steel_1080p.webm

CBR

VP9 を使用したライブ配信には、固定ビットレート モード(CBR)をおすすめします。

CBR モードのグラフ

CBR は、上限ビットレートを「ハード上限」として設定します。つまり、エンコード プロセスで、ネットワークが伝送できないレートでデータが生成されることはありません。

たとえば、リアルタイム通信(ビデオ会議)ストリームの場合、エンコード アプリケーションがネットワークで伝送できる以上のデータをネットワークに送信しないことが重要です。その場合、圧縮効率の低下よりも、音声と動画の同期の問題やフリーズしたフレームがユーザー エクスペリエンスに大きな影響を与えます。上限が定義されていることを確認することで、VP9 は上限に達すると品質を低下させます。

CBR モードでは、次の FFmpeg コマンドライン パラメータが使用されます。
ffmpeg
-quality realtime realtime の品質はライブ配信に適しています
-speed <arg> ライブ配信の場合、有効な値は 5 ~ 9 で、5 が最高品質、9 が最低品質です。(ビデオ オンデマンドの場合、0 ~ 5 です。上記の VBR を参照してください)。
-minrate <arg>
-maxrate <arg>
最小ビットレートと最大ビットレートを設定します。** CBR モードでは、これらを同じ -b:v ビットレート値に設定する必要があります**。

非常に簡単に言うと、ターゲット ビットレート、最小ビットレート、最大ビットレートを同じ値に固定し、オペレーションが時間依存であることを量子化器に伝えます。

CBR ビットレート モード: FFmpeg の例

次の例では、ビットレートを 2 Mbps と 500 kbps の目標値に設定する方法について説明します。

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 2000k -maxrate 2000k -quality realtime -speed 5 -c:a libvorbis \
  CBR_2000_realtime_speed_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 2000k -maxrate 2000k -quality realtime -speed 8 -c:a libvorbis \
  CBR_2000_realtime__8_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 5 -c:a libvorbis \
  CBR_500_realtime_speed_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 8 -c:a libvorbis \
  CBR_500_realtime_speed_8_120s_tears_of_steel_1080p.webm

結果

上記の各エンコードは、次の仕様の Ubuntu Linux システムで実行されました。

  • プロセッサ: 4x Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz
  • メモリ(RAM): 8060MB(1492MB 使用)
  • グラフィック: Intel HD Graphics 530(Skylake GT2)
  • OS: Ubuntu 16.04 LTS

すべてのケースで、ソースファイルは Tears Of Steel から切り取られた 1 分 20 秒のクリップでした。

ファイル エンコード時間(分) ディスク上のファイルサイズ
Q_g_1_crf_0_120s_tears_of_steel_1080p.webm 81 1.06GB
Q_crf_0_120s_tears_of_steel_1080p.webm 131 711.8MB
Q_crf_10_120s_tears_of_steel_1080p.webm 118 125.3MB
Q_crf_63_120s_tears_of_steel_1080p.webm 27 4.5MB
Q_g_1_120s_tears_of_steel_1080p.webm 51 25.9MB
Q_g_240_120s_tears_of_steel_1080p.webm 28 4.5MB
Q_g_480_120s_tears_of_steel_1080p.webm 10 4.4MB
CQ_4000_1000_crf_10_120s_tears_of_steel_1080p.webm 11 20.2MB
CQ_2500_1500_crf_10_120s_tears_of_steel_1080p.webm 9 24.1MB
CQ_1400_750_crf_10_120s_tears_of_steel_1080p.webm 50 13.2MB
VBR_good_0_120s_tears_of_steel_1080p.webm 3 23.4MB
VBR_good_5_120s_tears_of_steel_1080p.webm 4 23.9MB
CBR_2000_realtime_speed_5_120s_tears_of_steel_1080p.webm 2 24.8MB
CBR_2000_realtime_speed_8_120s_tears_of_steel_1080p.webm 1 21MB
CBR_500_realtime_speed_5_120s_tears_of_steel_1080p.webm 1 8.5MB
CBR_500_realtime_speed_8_120s_tears_of_steel_1080p.webm 1 7.1MB

-speed 値を 5 より大きく設定すると、VP9 処理速度が変化することがわかりました。これは量子化の大きな増加ですが(非常に低品質の高速ビットレートで強いディザリング効果が見られます)、VP9 は依然として非常に優れた低ビットレートの 1080p 出力を生成できます。ただし、大型ディスプレイよりも小型のモバイル デバイスに適しています。

リスケーリング(リサイズ)を伴うユースケースに関する考慮事項

VP9 のビットレート モードは明らかに分離されておらず、他の多くの引数やパラメータと組み合わせて、特定のユースケースをターゲットにすることができます。一般的なユースケースとしては、特定のデバイスをターゲットにするために、出力動画のサイズを変更することがあります。

この典型的な例は、HD ストリームを SD 出力に変更することです。この場合も、処理時間と出力ビットレートに大きな影響があります。2 つの FFmpeg コマンドが同一である場合、出力動画のサイズを調整するだけで、結果として得られるファイルのサイズが変更されます。ストリーミング モデルでは、ビットレートも変更されます。

この例として、各ビットレート モードの中間点の例を取り上げ、単にリスケーリング パラメータを追加しました。

Q モード
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 0 -crf 10 -quality good \
  -speed 0 -vf scale=640x480 -c:a libvorbis 640x480_Q_crf_10_120s_tears_of_steel_1080p.webm
CQ モード
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 1500k -maxrate 2500k -crf 10 -vf scale=640x480 -c:a libvorbis \
  640x480_CQ_crf_0_120s_tears_of_steel_1080p.webm
VBR モード
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 1500k -maxrate 2500k -quality good -speed 5 -vf  scale=640x480 \
  -c:a libvorbis 640x480_VBR_good_5_120s_tears_of_steel_1080p.webm
CBR モード
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 2000k -maxrate 2000k -quality realtime -speed 5 -vf  scale=640x480 \
  -c:a libvorbis 640x480_CBR_2000_realtime_5_120s_tears_of_steel_1080p.webm

リスケーリングの結果の表

ファイル エンコード時間(分) ディスク上のファイルサイズ
640x480_Q_crf_10_120s_tears_of_steel_1080p.webm 5 3.4MB
640x480_CQ_crf_0_120s_tears_of_steel_1080p.webm 2 22.4MB
640x480_VBR_good_5_120s_tears_of_steel_1080p.webm 1 22.6MB
640x480_CBR_2000_realtime_5_120s_tears_of_steel_1080p.webm 4 23MB

比較しやすいように、これらは以前の例と同じ FFmpeg コマンドですが、スケーリングは行いません。

ファイル エンコード時間(分) ディスク上のファイルサイズ
Q_crf_10_120s_tears_of_steel_1080p.webm 56 126MB
CQ_2500_1500_crf_10_120s_tears_of_steel_1080p.webm 9 24.1MB
VBR_good_5_120s_tears_of_steel_1080p.webm 4 23.9MB
CBR_2000_realtime_speed_5_120s_tears_of_steel_1080p.webm 1 24.8MB

ご覧のとおり、それぞれ出力ファイル サイズが大幅に縮小されています。ほとんどの例でエンコード時間が短縮されていますが、Q モードではエンコード時間が長くなっています。動画を「より」圧縮するには、より多くの処理が必要になります。そのため、品質が制約されていない場合(Q モードの場合など)、出力ファイルは小さくなることが予想されますが、実際には出力ファイルの生成にかかる時間が増加する可能性があります。エンコード プロセスによって、小さいファイルが常に高速で配信されるとは限りません。

and ビットレートを組み合わせて再スケーリングして削減する

最後の比較として、次の例では、CQ、VBR、CBR のリスケール例を再実行しますが、今回はターゲット ビットレートを 500 kbps のレベルに制限します。これは、画像サイズの縮小に合わせて、約 4 分の 1 になります。

CQ モード
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 500k \
  -minrate 350k -maxrate 550k -crf 10 -vf scale=640x480 -c:a libvorbis \
  640x480_CQ_crf_0_120s_tears_of_steel_1080p.webm
VBR モード
ffmpeg -i "120s_tears_of_steel_1080p.webm" -c:v libvpx-vp9 -b:v 500k \
  -minrate 350k -maxrate 500k -quality good -speed 5 -vf scale=640x480 -c:a libvorbis \
  640x480_VBR_good_5_120s_tears_of_steel_1080p.webm
CBR モード
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 5 -vf scale=640x480 -c:a libvorbis \
  640x480_CBR_2000_realtime_5_120s_tears_of_steel_1080p.webm

目標ビットレートの再スケーリングと引き下げの結果の表

ファイル エンコード時間(分) ディスク上のファイルサイズ
640x480_CQ_500_crf_0_120s_tears_of_steel_1080p.webm 1 7MB
640x480_VBR_500_good_5_120s_tears_of_steel_1080p.webm 1 7MB
640x480_CBR_500_realtime_5_120s_tears_of_steel_1080p.webm 1 7.6MB

ご覧のとおり、エンコード時間がさらに短縮されています。