動画エンコード方式"QVBR"と"VBR"の効率性・品質比較

MediaConvert, QVBR, VBR, 動画エンコード

株式会社レコチョクでバックエンドエンジニアをしている早坂といいます。
弊社のサービスである、dヒッツRecTVなどのバックエンドシステムを担当しています。

本記事の要旨

VBR・QVBR方式でエンコードした動画を以下の観点で比較し、効率性と品質がどのように異なるのかを検証します。

  • 効率性
    • ファイルサイズ
    • エンコード時間
  • 品質
    • ビットレートの推移
    • 3指標による定量比較(各指標についての説明は後述します)
      • VMAF(Video Multimethod Assessment Fusion)
      • PSNR(Peak Signal-to-Noise Ratio)
      • SSIM(Structural Similarity Index)

AWSの動画変換サービスであるAWS Elemental MediaConvert(以降、MediaConvertと記載)によりQVBRとVBR方式のエンコードします。

結論としては、VBR は効率的でコストを抑えやすい一方、複雑なシーンでは画質が不安定になる傾向がありました。また、QVBR は品質を一定水準に保ちやすいものの、エンコード時間やファイルサイズが増え、コストも高くなる点に注意が必要となります。

本記事の趣旨は、結論そのものではなく、結果へ至るプロセスを示すことにあります。
本記事を通して何か発見があれば幸いです。

対象読者

動画配信サービスに関わるエンジニアの方を対象としています。
特に、エンコードをMediaConvertで実施している場合は参考になる点があると思います。

本記事で言及しないこと

  • MediaConvertの概要・使い方
  • MPEGの仕様

MediaConvertについては、AWSの公式ドキュメントを参照いただくのが良いと思いますが、
MPEGの仕様については、こちらを読んでおくと詰まる点はないと思います。

VBRとQVBRの概要

VBR(Variable Bitrate)

VBRとは、音声や映像データの圧縮符号化方式のうち、ある単位時間あたりに転送されるデータ量(ビットレート)が変化する方式のことである VBRでは、転送するファイルの中でデータの変化が激しい箇所では、高ビットレートで転送することによって、画質や音質を維持したままデータを再現することができる。
引用元:https://japan.zdnet.com/glossary/exp/VBR/?s=4

主な特徴としては、以下が挙げられます:

  • シーン複雑度に応じたビットレート配分
  • 固定品質ではなく、最大・最小ビットレート範囲内での最適化
  • エンコード時間が比較的短い

VBRでエンコードするためには、平均ビットレートや最大ビットレートを指定します。この平均値や最大値を制約にして、入力の動画品質に近づけつつ圧縮します。

下の画像は、VBRでエンコードした場合のビットレート推移例です。灰色がエンコード後のビットレート推移、青色が入力のビットレート推移になります。本来少ないビット数で表現できるはずのフレームに余計にビットが割り当てられてしまったり、ビット数が非常に多い複雑な動きのあるシーンでは、割り当てるビット数が抑えられて画質が下がったりします。

vbr_example.png

引用:AWS公式-可変ビットレートが動画品質に及ぼす影響

配信において考慮が必要なファイルサイズや通信帯域量のコントロールがある程度可能な側面もあります。そのため、コストが予測しやすかったり、動画配信サービスの利用に必要な通信環境が定義しやすいメリットはあります。

QVBR(Quality-defined Variable Bitrate)

・QVBR は、ビットの無駄を最小限に抑えながら一定の動画品質を保てるよう動画ビットレートをスケールする、可変ビットレート制御の強化版

・動画ソースに含まれるすべてのマクロブロック、フレーム、シーンが分析され、情報の違いに合わせて自動的にビットが割り当てられます。

・動画品質 (VQ) の安定性向上: コンテンツ全体の均一性を維持し、複雑なシーンのみにピーク用の高ビットレートを使用
https://aws.amazon.com/jp/media/tech/quality-defined-variable-bitrate-qvbr/

主な特徴としては、以下が挙げられます:

  • 知覚品質レベル(Quality Level)による品質制御
  • コンテンツに応じた動的最適化
  • 品質を維持しながらビットレート効率を向上
  • 最大ビットレート制約下での品質最大化

QVBRは最大ビットレートのみを指定し、最大値に従うよう動画のシーンに応じてビットを割り当てます。最大値の範囲でビットを割り当てるため、画質が維持しながらエンコードできます。

下図は、QVBRでエンコードした場合のビットレート推移例です。VBRの例と同様、灰色がエンコード後、青色が入力のビットレート推移です。最大ビットレート内に収まるよう、入力動画のビットレートにおける変化に応じて上下しています。

qvbr_example.png

引用:AWS公式-ビットを無駄にしない = ビットを大幅に節約

VBRと比較すると計算コストが高いため、エンコード料金も高くなる傾向があります。
エンコード後のビットレートは、入力のビットレート推移に依存するため、VBRのような帯域やファイルサイズのコントロールは難しいという側面もあります。

検証

使用したデータ

検証には、Blender Foundation が公開しているアニメーション動画「Big Buck Bunny」を利用しました。ライセンスフリーであり、動画関連の技術検証記事でも広く使用されているサンプルです。

動画は以下から取得できます。

https://peach.blender.org/download/

検証で用いる動画のスペックは以下になります。

  • コーデック: H.264 (High)
  • ピクセル形式: yuv420p (progressive)
  • 解像度: 1920×1080
  • サンプルアスペクト比 (SAR): 1:1
  • ディスプレイアスペクト比 (DAR): 16:9
  • ビットレート: 4001 kb/s
  • フレームレート: 60 fps
  • タイムベース: 60 tbr, 60k tbn

再生確認環境

  • MacOS
    • Apple M1チップ
    • Sequoia 15.3.2
  • メモリ16GB
  • 内蔵 SSD
  • ソフトウェア
    • QuickTime Player

MediaConvertのエンコード設定

VBR

平均ビットレート値は、入力値の4Mbpsを基準とし、入力の 4001 kb/sに沿うようものとしました。
また、最大ビットレート値は、解像度ごとのビットレートの推奨値をいくつか調べ、おおよそ5~7Mbpsで設定されていることから、中庸の6Mbpsとしています。

推奨値参考記事
IBMサポート
Netflix技術ブログ

QVBR

MediaConvertでは、QVBRは品質設定を1~10の値で設定することができますが、
前述した使用データが1080pであるため、AWS公式ドキュメントの記述に従い、推奨値通りの 9を指定します。なお、視聴ユースケースごとのQVBR品質レベル設定はAWS Blogに記載の基準が参考になります。

なお、あくまでビットレートの変化を主眼に置いた比較を行いたいため、ピクセル形式や解像度、ディスプレイアスペクト比やフレームレートなどのパラメータは、入力のままとする設定でエンコードします。

評価指標

動画品質を客観的に評価するため、VMAF、PSNR、SSIMを指標として採用します。
本記事の検証では、それぞれ以下を役割として用いることとします。

  • VMAF
    • 「人間が実際に見て感じる画質」を評価
  • PSNR
    • 入力映像との画素レベルでの差分を評価
  • SSIM
    • 構造(写っている物の位置関係)の類似性を評価

これらの指標については、MediaConvertで出力することが可能です。
そのため、MediaConvertにより計算された指標値を評価することとします。

https://docs.aws.amazon.com/ja_jp/mediaconvert/latest/ug/per-frame-metrics.html

VMAF(Video Multimethod Assessment Fusion)

Netflixが開発に寄与した知覚品質評価指標で、人間の視覚特性を考慮した総合的な品質評価を0~100のスコアで示します。教師ありの機械学習で、3つの指標を用いて品質を予測します。

Visual Information Fidelity (VIF): 4つの異なる空間スケールでの情報忠実度の損失を考慮

Detail Loss Metric (DLM)[8]: ディテールの損失や視聴者の注意をそらす劣化を測定

Mean Co-Located Pixel Difference (MCPD): 輝度成分におけるフレーム間の時間的差異を測定
Wikipedia

3つをそれぞれ大雑把に捉えると、以下のようになりますが、人間が動画を見るときに自然と気にするような観点を指標としています。

  • VIF
    • 入力映像に含まれる情報量(細かさ・構造)が、どの程度保持されているか
  • DLM
    • 人間が知覚できる程度の劣化(ノイズや歪み)があるか
  • MCPD
    • フレーム間の滑らかさが保たれているか

なお、VMAFはオープンソースとして公開されています。
https://github.com/Netflix/vmaf

PSNR(Peak Signal-to-Noise Ratio)

従来から使用されている客観的品質指標で、入力との色の差分を基準とします。
単位はdB(デシベル)で示しますが、多くの場合数十dBの範囲で示されます。

PSNRは、計算の中で画素ごとの色の2乗における平均値を用いますが、
平均によって均す性質上、画像全体で少し劣化している時の値と部分的に大きく劣化している時の値は近くなってしまいます。そのため、下記のように同一コーデックによる比較に限り有効性があるとの見解もあるようです。

通常はPSNRが高い方が高画質であるが、場合によっては低いPSNRにもかかわらず元の画像に近いように人間に知覚される場合があるため、圧縮に用いるコーデック同士を比較する際はPSNR値はあくまで目安とすべきである。数値が理論的に有効といえるのは同じコーデック(またはコーデックの種類)で同じ元の画像の結果を比較した場合のみである
Wikipedia

後述する検証については、同一コーデックでのVBR、QVBRを比較するため、本指標を用いることとします。

SSIM(Structural Similarity Index)

構造的類似性を評価する指標で、輝度、コントラスト、構造の類似性を総合的に判定します。1.0に近いほど高品質です。
具体的には、11×11、もしくは8×8の画素範囲を計算対象ブロックとして切り出し、輝度の平均値、コントラストのばらつき(標準偏差)、描かれている事物の構造の変化(共分散)を算出します。3つの積が切り出したブロックにおけるSSIM値となります※。1フレームにおける各ブロックを計算し、SSIM値の平均(Mean SSIM)がそのフレームにおけるSSIM値となります。

※積と表現しましたが、実際は3つそれぞれの値に対し、重み付けのための指数を設定します。複雑さを避けるために簡略的に各指数を1とした場合の記述としています。詳しくは、wiki論文などを参照ください。

結果

品質評価

ビットレート推移分析

plotbitrateというツールを用いて、時間経過のビットレート推移を確認します。

入力ファイル

bitrate_original_mark.png

最大値は約20Mbps、平均は約4Mbpsです。シーンによってビットレートに大きく変化があります。
ビットレートに変化が大きい分、動きのあるシーン、動きのないシーンとである程度効率的にビットが割り当てられている動画であることが把握できます。

ビットレートが最も高くなっているあたりの 7:00~ 7:20は、下のキャプチャ画像のシーンです。
飛んでいるフランキー(画像中央のキャラクター)の下で、無数の葉っぱが激しく飛び散っているシーンとなっています。(シーンを通して実際の動きを確認されたい場合はこちらに記載したサイトからダウンロードしてご確認ください)

後述するVBR、QVBRでは、入力と比較して全体的なビットレートの変動を見ていきます。

VBRの結果

bitrate_vbr_mark.png

最大値が約10Mbps、平均値が約4Mbpsです。
入力で見られたビットレートの変動が小さく、VBRの特徴通り、平均ビットレートに比較的近い値で推移しています。入力で最も高いビットレートを示した 7:00~ 7:20の箇所は1/3ほどのビットレートに抑えられています。この範囲は、最大値が半分以下に下がっています。再生して入力と見比べてみると、直感的な評価として、VBRは葉っぱの動きや画質が荒くなっていました。具体的な画像の比較は、後述する評価値SSIMに関する記載を参照ください。

QVBRの結果

bitrate_qvbr9_mark.png

最大値は約10Mbps、平均は約5Mbpsです。
比較的入力のビットレート推移に沿いつつ、入力に見られた大きな変動が抑えられていることがわかります。平均としては入力よりもビットレートが1Mbpsほど高くなりました。これは、QVBRの特徴で全体の品質を均一にするようビットを割り当てたことが要因にあります。

MediaConvertのメトリクスにより出力された各指標をmatplotlibを用いてグラフ化し、比較します。

VMAF

上がVBRの結果、下がQVBRの結果です。


以下、AWSのドキュメントに記載のVMAF値に対する評価指標です。

Excellent: 90 or greater (premium streaming)
Good: 70-90 (typical streaming)
Fair: 50-70
Poor: 50 or less
AWS公式 メトリクス分析手法-VMAF

フレーム全体として、値の増減の振れ幅がQVBRの方が小さくなっており、QVBRは全フレームにおいて Goodの評価です。VBRは一部のフレームにおいて70以下となっているため、 Fair(程よい)の評価となります。

両者ともに低い値が顕著になっているフレーム数25000~27000に着目したいと思います。
何分何秒あたりを指すのかを計算します。
VBR、QVBRともに入力と変わらずフレームレートが60fpsとなるので、
25000 / 60(フレームレート) / 60(1分の秒数) 6.94
27000 / 60(フレームレート) / 60(1分の秒数) 7.5
となり、おおよそ7分~7分30秒の間となります。

入力のビットレート推移に当てはめてみると、下図となり、急激なビットレート上昇の箇所と重なります。
VBR、QVBRともに、この急激なビットレートの変化を表現できていないことがVMAFの指標値からわかります。
bitrate_original_mark.png

PSNR

上がVBRの結果、下がQVBRの結果です。


以下、AWSのドキュメントに記載のPSNR値に対する評価指標です。

Excellent: 40dB or greater (high bitrate, visually lossless)
Good: 30-40dB (typical streaming quality)
Poor: 30dB or less (visible artifacts)
AWS公式 メトリクス分析手法-PSNR

VBR、QVBRともに似たような推移をしているものの、VMAF結果と同様、VBRの方がフレーム全体として値の振れ幅が大きくなっています。両者ともに、40dB以下のフレームが所々存在するものの、全体としては Excellentの評価になります。

数箇所100dBに近づいているのは、動画中のシーン切り替えで画面が真っ暗になるフレームです。PSNRは画素の差分が基準になるため、真っ暗なシーンだと比較してもほぼ同値となり、PSNR値が高くなっています。

ここで、真っ暗になるため差分が出ないはずが、VBRは100dBに近いがQVBRは80dB程度に留まっている点に着目します。QVBRはシーンの複雑度に応じてビット割り当てを変えるエンコード方式ですが、真っ暗なフレームについてはビット割り当てを最小限にします。VBRは平均ビットレート、最大ビットレートなどの制約の中で入力の画素に極力近づくようにビットを割り当てます。言い換えると、画素数を入力の映像へ近づくようにビットを割り当てるVBRと、一定の視覚的基準が満たせれば画素レベルの再現はしないQVBRの違いが出ています。

ただ、QVBRも最初と最後のフレームは、80dBを超えて、100dBに近くなっています。
これについては予測も含みますが、最初のフレームはQVBRのビットレート制御の基準が確立できないため、多くのビットレートを割り当てる傾向があると思われます。

最後のフレームについては、QVBR、VBR共通のビットレート制御が関係しています。
以下の画像は、最後のフレーム数 38071から20フレームほど前までのPSNR値です。
50dB台で推移していたところから、急に最後の20フレームで100dBに変わっています。

このあたりのフレーム種別を確認してみます。
以下が ffprobeを用いたフレーム抽出結果です。

終端フレームから20フレーム前が動画の最後のIフレームとなっており、最後のIフレーム以降が全て100dBとなっていました。原因としては、最後のIフレームと終端フレームをQVBRによるビットレート制御機構が検知し、割り当てるビット数の制約を考慮する必要がないため、入力の品質を再現するようにビットを割り当てたことがあるかと思います。

SSIM

上がVBRの結果、下がQVBRの結果です。


以下、AWSのドキュメントに記載のSSIM値に対する評価指標です。

Excellent: 0.95 or greater
Great: 0.90-0.95
Good: 0.80-0.90
Poor: 0.80 or less
AWS公式 メトリクス分析手法-SSIM

VMAF、PSNR結果と同様、VBRの方がフレーム全体として値の振れ幅が大きくなっていますが、両者ともにほとんどのフレームで Great以上の評価となります。ただ、VBRのフレーム数25000~27000のあたりのみ Good評価です。

VBRの Good評価となった箇所に着目します。
VMAFの評価にも記載した通り、入力のビットレートが最も高くなった箇所です。VBRのビットレート推移では、この箇所のビットレートは入力のビット数と比較し、1/3ほどに下がっていました。ビット数が少なくなった分、構造比較としても差異が生まれ、顕著にSSIM値が下がったと思われます。
QVBRも低い値を示しているため、最もSSIM値が低い値を示したフレームを抽出し、入力・VBR・QVBRの結果を比較してみます。

input_frame.png

vbr_frame.png

qvbr_frame.png

一見するとわかりづらいですが、入力・VBRで比較すると全体的に画質が荒くなっています。また、微々たる差ではありますが、入力とQVBRも比較すると、QVBRは少し荒いこともわかります。

本検証の場合、主に構造の類似性を主眼にしてSSIMを評価しようとしていますが、コントラストや輝度も値に関わります。入力ほど高いビットレートがこのフレームに割り当てられていないことが、コントラストや輝度に影響するため、低いSSIM値と関係しています。

効率性評価

ファイルサイズ

エンコード方式 ファイルサイズ
入力 355.9MB
VBR 333.7MB
QVBR 415.4MB

QVBRはビットレート平均が高くなったため、ファイルサイズが比較的大きくなっています。
VBRは、入力とより100kb程度低い平均ビットレートであったため、小さくなっています。

エンコード時間

エンコード方式 エンコード時間
VBR 15分19秒
QVBR 31分5秒

QVBRはVBRより2倍ほどのエンコード時間がかかっています。
MediaConvertの料金体系はコーデックが同じだとエンコード時間に依存するため、料金は単純に2倍ほどかかります。
QVBRの品質レベルを 9よりも下げると短縮できそうですが、品質を下げることになるためQVBRの利点が活きづらくなってしまいます。実際に利用する場合、品質レベルの調整に際してコストと得たい品質のバランスを定義しておくこと方が良さそうです。

検証まとめ

各指標の評価観点を再掲します。

  • VMAF
    • 「人間が実際に見て感じる画質」を評価
  • PSNR
    • 入力映像との画素レベルでの差分を評価
  • SSIM
    • 構造(写っている物の位置関係)類似性を評価

VBRについては、動きが顕著なシーンで視認できる程度の画質の劣化がありました。
翻って、QVBRはビットレートを抑えつつも一定の画質を維持できることもわかりました。
画素レベルや構造の変化については、シーンの動きの多さによって上下はあるものの、総合的に見て、VBR・QVBRとも一定の品質を維持していました。

QVBRの方が3指標ともに高水準でしたが、PSNRの指標では、VBRは画素レベルで可能な限り(平均ビットレートの制限内で)入力の品質を保とうとする性質があるため、部分的にQVBRよりも高い品質となっているフレームが見られました。

総じて、ファイルサイズやエンコードコストも含めて考えると、本記事冒頭に記載した両者の特徴に沿った結論となります。

  • ファイルサイズを重視する場合(配信・ストレージ制約がある場合)→ VBR
  • 画質の安定性を重視する場合(視聴体験を優先する場合)→ QVBR

最後に

本記事では、QVBR・VBRの効率性と品質を定量的な指標を持って比較しました。
両者の特徴は様々な記事で見かけるものの、具体的にどう違うのかを示した情報は多くないです。結論は一般論になってしまいましたが、エンコード方式採用の参考や、一般論から一歩踏み込んだ理解につながれば幸いです。

最後まで読んでくださりありがとうございます。