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

はじめに

ビットレート モードの詳細については、基本エンコードのページをご覧くださいが、CQ(制約あり)モードのみに対応しています。

このドキュメントでは、VP9 ビットレートを調整してさまざまなシナリオで最適化できる、その他の実践的な方法について説明します。下記の例では、FFmpeg を使用しています。

圧縮

VP9 などの動画圧縮技術は、エンドユーザーに鮮明な画像や動きを伝えるのに必要なデータの量を減らすことを目的としています。

これを実現するために使用される主要な手法の 1 つが量子化です。量子化ツールでは、画像のさまざまなデジタル化要素を数学的に簡素化します。たとえば、使用する色の範囲を縮小し、さらにデータに対して数学関数を実行して「滑らかにする」ことができます。色範囲が縮小されると認識される解像度が低下します。そのような関数は数多くあります。

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

VP9 では、量子化は変換係数に対して実行されます。これにより、エンコードを追加することで、画質の低下に必要なビットレートが削減されます。

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

ユースケースの最適化

ユーザーが自分のニーズに合わせて VP9 圧縮を調整できるように、多くのプログラム インターフェースを通じて、最初の圧縮時に品質とビットレートのバランスを調整することが可能です。

エンコーダの速度、品質、ビットレートはトレードオフの関係にあります。

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

  • ユーザーが出力 VP9 エンコード ファイルのサイズを小さくし、迅速に配信できるようにすることに重点を置いている場合は、量子化ツールが画像を処理できる時間を削減できるように準備する必要があります。これにより、量子化ツールが動作できる詳細情報が少なくなります。

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

正しい選択は各ユースケースにとって非常に具体的になります。バランスをユースケースに合わせて簡単に調整できるように、VP9 は 4 つのビットレート モードでの単純な設定をサポートしています。

VP9 ビットレート モード

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

モード
定数量子化関数(Q) 固定量子化子の値を指定できます。ビットレートは一定ではありません
制限品質(CQ) 最高画質を設定できます。品質はビットレート パラメータによって異なる場合があります
可変ビットレート(VBR) ビットレートの制約内での品質とビットレートのバランスを保ちます
定数ビットレート(CBR) 品質にばらつきがある状態でビットレートをほぼ一定にしようとしている

Q

Q モードのグラフ

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

Q 設定のユースケースは、デジタル映画、デジタル編集スイート、デジタル サイネージ アプリケーションにあります。これらのアプリケーションは、物理ストレージ メディアで、または制約のない時間でコンテンツを配信できる場合が多く、実際に使用されるコンテンツよりもかなり前に、望ましい出力品質を得る必要があります。

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

定数量子化モードでは、最小限の構成が必要です。その名が示すように、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 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 番目の例の 2 番目にパラメータを追加しないと、結果は同じになります。

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v 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 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 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 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 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 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 という非常に大きなファイルが生成されます。これを 4.5 MB のファイルで -g 240(明示的にデフォルトと設定した場合)に変更し、-g 480 で最終的に 4.4 MB のファイルを使用した場合と比較します。

カスタマーケア

CQ は、ファイルベースの動画で推奨されるモードです。

CQ モードのグラフ

ほとんどのコンテンツ タイプでは、ビットレートの上限を設定して制約品質(CQ)モードを使用することをおすすめします。ほとんどの動画には、高モーション シーン(アクション シーケンスなど)と、詳細のないシーン(会話など)の組み合わせが含まれています。CQ モードでは、エンコーダが時間のかかる簡単なシーン(ビットを無駄にしない)中でも妥当な品質レベルを維持しながら、難しいシーケンスに対してより多くのビットを割り当てることができます。

それでも、上限の範囲を指定してプロセスを制限する必要があります。そうしないと、圧縮が行われない場合もあります。また、画像が黒くなり、エンコード プロセスがほとんど機能しない場合でも、低範囲を設定すると、そのデータはスループットがおそらく達成できます。ただし、最終的には黒がかなり圧縮されず、外観が「黒」になります。

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

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

最初の例では、適度に幅広い制約が設定されています。上の Q の例と比較すると、ビットレートを決定する範囲が広くなり、出力品質が著しく高くなることがわかっています。ファイルサイズはさらに大きくなります。

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v 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 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 vp9  -b:v 1000k \
  -minrate 750k -maxrate 1400k -crf 10  -c:a libvorbis \
  CQ_1400_750_crf_10_120s_tears_of_steel_1080pp.webm

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

VBR

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

VBR モードのグラフ

VBR モデルでは、キーフレームと同様に、アクション シーンは「簡単」なシーンよりも高いビットレートでエンコードできます。

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

VP9 VBR は、動きの激しいスポーツなどのコンテンツをエンコードする場合にも推奨されます。そのような複雑度の高いコンテンツの場合、VBR は、動きが少ない時間帯に高品質の音声を実現します。

VBR モードでは、次の FFmpeg コマンドライン パラメータが使用されます。
FFmpeg
-quality good 存在する場合、FFmpeg は後続の -speed の設定を考慮します。
-speed <arg> VIDEO ON DEMAND の場合、有効な値は 0 ~ 4 で、0 が最高品質の値、4 が最低値です。(ライブ ストリーミングの範囲は 5 ~ 8 です。下記の CBR をご覧ください)
VBR ビットレート モード: FFmpeg の例
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v 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 vp9  -b:v 2000k \
  -minrate 1500k -maxrate 2500k -quality good -speed 5  -c:a libvorbis \
  VBR_good_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 1500k -maxrate 2500k -quality good -speed 8  -c:a libvorbis \
  VBR_good_8_120s_tears_of_steel_1080pp.webm

CBR

VP9 を使用したライブ ストリーミングでは、コンスタント ビットレート モード(CBR)をおすすめします。

CBR モードのグラフ

基本的に、CBR は上位ビットレートを「ハード天井」として設定します。つまり、エンコード プロセスでは、ネットワークが対応できない速度でデータを生成することはできません。

たとえば、リアルタイム通信(ビデオ会議)ストリームの場合、エンコード アプリケーションがネットワークに送信可能なデータ量を超えるデータを処理しないようにすることが重要です。保存されていた場合、音声と動画の同期に関する問題やフリーズしたフレームがユーザー エクスペリエンスに大きな影響を及ぼし、圧縮効率が低下します。ハードシーリングが定義されていることを確認することで、VP9 はその天井に到達したときに品質を低下させます。

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

非常に簡単に言うと、ターゲット、最小ビットレート、最大ビットレートを同じ値に固定し、このオペレーションには時間的な制約があることを量子化ツールに伝えます。

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

以下の例では、ビットレートを 2 Mbps と 500 Kbps の目標に設定しています。

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 2000k -maxrate 2000k -quality realtime -speed 0 -c:a libvorbis \
  CBR_2000_realtime_0_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 2000k -maxrate 2000k -quality realtime -speed 5 -c:a libvorbis \
  CBR_2000_realtime_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v 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 vp9  -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 0 -c:a libvorbis \
  CBR_500_realtime__0_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 5 -c:a libvorbis \
  CBR_500_realtime_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 8 -c:a libvorbis \
  CBR_500_realtime_8_120s_tears_of_steel_1080p.webm

結果

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

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

すべてのケースのソースファイルは、Tears Of Steel から選定された 1 分 20 秒のクリップ(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
VBR_good_8_120s_tears_of_steel_1080p.webm をご覧ください。 1 23.9MB
CBR_2000_realtime_speed_0_120s_tears_of_steel_1080p.webm 98 21MB
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_0_120s_tears_of_steel_1080p.webm 73 6.2MB
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 のビットレート モードは明確に分離されておらず、他の多くの引数やパラメータと組み合わせて、ユースケースを明示的にターゲットにできます。一般的なユースケースの 1 つは、出力デバイスのサイズを再スケーリングして特定のデバイスをターゲットとすることです。

典型的な例は、HD ストリームを SD 出力に変更する場合です。この場合も、処理時間と出力ビットレートに大きな影響を与えます。他の 2 つの FFmpeg コマンドが同一であるシナリオでは、単に出力動画のサイズを調整するだけで、生成されるファイルのサイズが変更されます。ストリーミング モデルではビットレートが実際に変更されます。

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

Q モード
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v 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 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 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 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 モードなど)、出力ファイルが小さくなると予想される場合でも、実際には出力ファイルの作成にかかる時間が長くなる可能性があります。小容量のファイルは常にエンコード プロセスにより迅速に配信されるとは限りません。

ビットレートの再スケーリングと削減

最後の比較では、CQ、VBR、CBR の再スケーリングの例を再実行しますが、今回は、ターゲット ビットレートを 500 kbps のレベル(画像サイズのスケールダウンに沿った約 1/4)に制限します。

CQ モード
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v 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 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 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

ご覧のように、エンコード時間はさらに短くなっています。