👋

【Vision Pro】ビデオ圧縮技術について

に公開

ビデオ圧縮とは?

ビデオは連続した静止画像の集合です。例えば30fps(1秒間に30フレーム)の場合、1秒のビデオには30枚の写真が必要です。各写真が1MB(メガバイト)だったとすると、1秒で30MB、60秒のビデオでは1.8GBに膨れ上がります。このようなサイズのビデオをインターネットやエッジデバイスで扱うのは非常に大変です。そこで登場するのがビデオ圧縮の技術です。

圧縮の基本的な考え方は「無駄をなくす」ことです。例えば同じ色が繰り返し現れる場合、毎回「青、青、青…」と保存するのではなく、「この領域はすべて青である」と記録すれば十分です。ニュースの背景のように1秒程度ほとんど変化しないシーンでは、「前の画像を再利用する」と指定するだけで新しいデータは不要です。この効率化こそがビデオ圧縮の要点です。


H.264:広く使われている圧縮技術

これまで主流だったビデオ圧縮技術がH.264です。H.264では画面を16×16ピクセルの小さなブロックに分割します。ビデオは連続するフレームの集合ですから、各フレームを前のフレームと比較し、「このブロックは右に2ピクセル動いた」「まったく動いていない」といった情報を記録します。この動きの情報をモーションベクターと呼びます。

モーションベクターとは?

モーションベクターは、動画内の「ある領域がどこへ動いたか」を示す矢印のようなものです。ビデオは1秒間に何十枚ものフレームで構成されているため、ある物体がフレーム間で移動した際に、すべてを描き直すのではなく、「前の画像を少しずらして再利用する」ことで圧縮を行います。

H.264が優れている点のひとつが、1/4ピクセル精度でモーションベクターを計算できることです。例えば:

  • ボールが「右に1ピクセル動いた」場合、モーションベクターは (1, 0) になります。
  • 「右に1.25ピクセル動いた」場合は (1.25, 0) です。
  • 「右に0.5ピクセル、下に0.25ピクセル動いた」場合は (0.5, 0.25) です。

この1/4ピクセル精度のおかげで、動きがより滑らかに表現できます。

1/4ピクセル精度の利点

全ピクセル精度だと動きがカクつきやすいですが、1/4ピクセル精度では、ゆっくり歩く人の動きや風に揺れる葉の細かな動きまで自然で滑らかに再現できます。これにより、より少ないデータ量で高品質なビデオが実現します。

どうやって1/4ピクセルを作るのか?

「ピクセルは整数なのに、なぜ0.25ピクセル?」と思うかもしれません。これはH.264がInterpolationという手法を使っているから可能です。

Interpolationとは?

Interpolationとは、実際のピクセル間に「仮想の中間ピクセル」を計算して作ることです。例えば、隣り合う2つのピクセルの色を平均したり、さらに複雑な計算を行って滑らかな中間値を生成したりします。

  • 左側のピクセルが「輝度100」、右側が「輝度120」の場合、補間はこの間を4分割して「105」「110」「115」といった値を作り出します。

H.264の場合

H.264では、6タップフィルタと呼ばれる方法で補間を行います。6つの隣接するピクセルを参照してなめらかな半画素値を計算し、その中間をとることで1/4ピクセルを生成します。これにより、きわめて微細な動きまで再現できます。


HEVC(H.265)

いつまでもH.264の話をしていてもHEVCにたどり着かないので、ここからはHEVCに移ります。H.264では16×16ピクセルのブロックを扱うと述べました。H.264が開発された当時は主にHD(1080p)が想定されていました。しかし4Kや8Kディスプレイが登場すると、16×16ピクセルブロックにはいくつかの問題が出てきました:

  • マクロブロック(16×16)が小さすぎる
    • HDの空では「全部青」で問題なくても、4Kでは細かい雲のパターンが現れ「同じ」と言えなくなります。
  • 広い単色エリアに非効率
    • 空や壁などの広い単色エリアでは、16×16ピクセルのブロックが大量にできてしまい非効率的です。H.264は最大16×16に制限されるため、大きな平坦エリアを何十もの16×16ブロックに分割せざるを得ません。
    • 問題点:100×100ピクセルの領域を「全部青」と一度に表現したいのに、H.264では6×6=36個のブロックに分割され、それぞれ「青」と表現するため、無駄が生じて圧縮効率が下がります。
  • 動きや予測の精度不足
    • 当時は1/4ピクセルのモーションベクターが画期的でしたが、4Kにはやや粗い精度です。
    • 問題点:4Kではピクセルが細かいため、動きもより微細になります。HDでの「1ピクセル右」が4Kでは「0.1ピクセル右」かもしれず、H.264の1/4ピクセル(0.25)精度では正確に捉えられず、残差データが増えます。

Coding Tree Unit (CTU):ブロックサイズ革命

H.264が16×16ピクセルのマクロブロックに固定されていたのに対し、HEVCでは Coding Tree Unit(CTU) という新しい仕組みを導入しました。

  • サイズ:最大64×64ピクセル(H.264の16×16の16倍の面積!)から最小4×4ピクセルまで柔軟に設定可能。
  • クアッドツリー構造:CTUは4分割(16×16)し、さらに分割(8×8、4×4)とツリー状に分解できます。これによりシーンごとに最適なサイズを選べます。

これにより、顔のしわなど細かいディテールは4×4ブロック、青空のような単純な領域は64×64ブロックで表現でき、画質と圧縮効率の最適なバランスを実現します。

HEVCの構成要素

ここでは、HEVCのエンコード・デコードで重要となる主要な要素とフレームについて説明します。

VPS(Video Parameter Set)

VPSは「Video Parameter Set」の略で、HEVCビデオ全体に関する基本情報をまとめたものです。HEVCは複数のレイヤー(高画質と低画質を同時に扱うなど)をサポートするため、その構造を定義します。

  • ビデオレイヤー数(例:基本画質と高画質の2レイヤー)。
  • プロファイルとレベル(この動画で使用するHEVCの機能と必要な性能)。

4K動画とスマホ向け低画質版を同梱する場合、VPSには「レイヤーが2つあり、4Kレイヤーは低画質レイヤーに依存する」と記載されることがあります。デコーダー(再生側)はまずこれを設計図のように参照します。

ポイント

  • H.264には存在せず(単一レイヤーを前提としていた)。
  • HEVCの拡張性のために追加された。

SPS(Sequence Parameter Set)

SPSは「Sequence Parameter Set」の略で、1つのシーケンス(連続するフレーム群)に関する設定を定義します。ビデオの「基本仕様」に相当します。

  • 解像度(例:4Kなら3840×2160)。
  • フレームレート(例:30fps)。
  • CTUサイズ(例:最大64×64)。
  • ビット深度(8ビットまたは10ビット。10ビットはHDR対応など)。
  • カラースペース(色の表現方法)。

4K映像では、SPSに「3840×2160、30fps、CTUは64×64、10ビット」と書かれることがあります。デコーダーはこれを参照して再生設定を行います。

ポイント

  • シーケンスが変わる(解像度が異なるシーンに移る)場合は新しいSPSが必要。
  • H.264にもありましたが、HEVCではCTUなど新機能の設定が追加されました。

PPS(Picture Parameter Set)

PPSは「Picture Parameter Set」の略で、各フレーム(1枚の画像)に対する詳細設定をまとめたものです。SPSが全体仕様なら、PPSは個々の画面に対するルールと言えます。

  • タイルやスライスの分割方法(並列処理のための画面分割)。
    例:4Kの戦闘シーンでは小さいタイルを使って詳細に処理し、静かな風景シーンでは大きいタイルで効率化する。
  • デブロックフィルターやSAOの設定(オン/オフや強度など)。
    • デブロックフィルター:圧縮によりブロック境界にギザギザ(ノイズ)が生じることがあります。このフィルターはそれを滑らかにします。
      例:「このフレームに強く適用する」「オフにする」
    • SAO(Sample Adaptive Offset):HEVCの新機能で、色や輝度を微調整して「圧縮アーティファクト」を低減します。
      例:4Kの雲のシーンで、ぼやけたエッジをシャープにしたり、暗部を自然に見せたりする。
  • エントロピー符号化(CABAC)の詳細パラメータ。
    • エントロピー符号化はデータをビットに変換する最終段階です。HEVCではCABACのみを使用します(賢いが複雑)。
    • 動きの少ないシーンでは単純に、複雑なシーンでは徹底的に圧縮するよう設定します。

「このフレームは4タイルに分割し、デブロックフィルターを強く適用する」といった設定がPPSに記載されます。SPSで「4K映像」と指定されていれば、PPSで「どのように圧縮するか」が詳細に定義されます。

ポイント

  • フレーム単位で変更可能(動きの激しいシーンでフィルターを調整するなど)。
  • H.264にもありましたが、HEVCではタイルやSAOなど新機能の設定が追加されました。

IDR(Instantaneous Decoding Refresh)

IDRは「Instantaneous Decoding Refresh」の略で、特殊なIフレーム(イントラフレーム)です。ビデオの「リセットポイント」のような役割を果たします。

  • 完全独立:IDRは前のフレームに依存せず、イントラ予測のみで単独再生できます。
  • リフレッシュ:IDR以降のフレームは前のフレームを参照しません。デコーダーが「新たに開始」できるポイントです。
  • 例:ビデオの先頭やシーンが大きく変わるとき(映画のチャプター開始など)に使用されます。

4K映像では、先頭にIDRフレームを配置して再生を開始します。途中からシークしてもIDRから再生を始めればエラーなく視聴できます。

ポイント

  • H.264にも存在し、HEVCでも同様の役割を担います。ストリーミングやエラー復旧に不可欠です。

Bフレーム(Bi-directional Predicted Frame)

Bフレームは「双方向予測フレーム」で、過去と未来のフレームの両方を参照します。データ量をさらに削減する「賢いフレーム」です。

  • 双方向予測:過去のフレーム(IDRやPフレーム)と未来のフレーム(次のPフレームなど)を参照し、「ここは両者の中間」と予測します。
  • 最小限のデータ:両方向の変化から補間するため、記録する情報はわずかです。
  • 例:ボールが左右に移動するシーンでは、「前後のフレームの間にある」と計算します。

4Kの歩行シーンでは、Bフレームが前後のフレームから動きを補間し、最小限のデータでスムーズに再現します。

ポイント

  • 予測モードが細かい(例:33方向)ため、過去と未来からの補間が超高精度です。
  • 圧縮効率は最高ですが、周辺フレームなしでは再生できず、エンコードも複雑です。

GOPを確認しよう

HEVC(High Efficiency Video Coding)におけるGOPはGroup of Picturesの略で、圧縮と再生のために特定の順序で並べられたフレームの集まりを指します。通常、Iフレーム(イントラ符号化フレーム)に続いてPフレーム(予測符号化フレーム)やBフレーム(双方向予測フレーム)が並びます。
VPS、SPS、PPSはHEVCビデオ再生準備用のパラメータであり、GOPには含まれません。

GOPを確認したい場合は、以下のPythonスクリプトを使用できます。
https://gist.github.com/alastairmccormack/7041ee993adb5c911f90

タイルとは何か(HEVC)?

タイルの主な機能は、同一フレーム内で独立した領域ごとに分割することで並列処理を容易にすることです。例えば3×3のタイルでHEVCビデオをエンコードすると、それぞれを並列にデコードでき、マルチコアシステムでエンコード・デコード速度が大幅に向上します。また、各タイルはVPS、SPS、PPSなどの上位レベルの共通情報を共有しつつ、フレーム内部では独立した自己完結構造を持ちます。

スライスとは何か(HEVC)?

スライスは、CTUの連続したグループで、通常はラスタースキャン順に処理されます(HEVCにはFMOがないため適用されませんが)。スライスはもともと伝送時のデータ損失の影響を限定するために導入されました。スライスが破損(パケットロスなど)した場合、デコーダーは次のスライスにスキップしてデコードを続行でき、被害を最小限に抑えます。スライスの目的はタイルとは異なります。

Discussion