YVYUとは何か?4:2:2のパックドYUVと他フォーマットとの違いを徹底解説

YVYU とは — 基本概要

YVYU(ワイ・ブイ・ワイ・ユー)は、デジタル映像で用いられる「パックド(packed)YUV 4:2:2」ピクセルフォーマットの一つです。主にビデオキャプチャ、映像伝送、ハードウェア映像処理の分野で見られるフォーマットで、1組のクロマ(色差)サンプルを2つの輝度(Y)サンプルが共有することで、色情報を横方向で半分にサブサンプリング(4:2:2)して格納します。

バイトオーダー(ピクセルレイアウト)

YVYU の特徴は、1組(2画素)あたり4バイトで表現され、そのバイト並びが次のようになる点です:

  • byte0 = Y0(画素0の輝度)
  • byte1 = V0(共有される色差V)
  • byte2 = Y1(画素1の輝度)
  • byte3 = U0(共有される色差U)

したがって、2画素の順序は「Y0 V0 Y1 U0」となります。これは同じ4:2:2族でも順序が異なる「YUYV(Y0 U0 Y1 V0)」「UYVY(U0 Y0 V0 Y1)」などと区別されます。ピクセル・バイト列の順序は互換性に直結するため、映像パイプラインで取り扱う際は形式名とバイト並びを厳密に確認する必要があります。

YVYU と他の YUV 形式の違い

主な比較ポイントは「サブサンプリングの種類」と「メモリレイアウト(パックド vs プラナル)」です。

  • サブサンプリング: YVYU は横方向で 4:2:2 を採用(色解像度が横方向で半分)。YUV 4:2:0(例: YV12, NV12)は縦横ともに色解像度が低い。
  • メモリレイアウト: YVYU はパックド(各ピクセルペアに対し Y,V,Y,U の順で並ぶ)で、Y と U/V が同一バイトストリーム内に interleaved されています。これに対して YV12 や NV12 はプラナル(Y面、U面、V面が別々のメモリ領域)です。
  • バイト順: YVYU は U と V の順序が独特(V が先)である点が、YUYV や UYVY などと混同すると色ずれの原因になります。

どんな場面で使われるか(用途)

  • ビデオキャプチャデバイス(USBカメラ、キャプチャカード)の一部は出力フォーマットとして YVYU をサポートすることがある。
  • ハードウェア映像パイプライン(エンコーダ/デコーダ)や古い映像デバイスのドライバで観察されることがある。
  • リアルタイム処理や低レイテンシ映像処理の現場では、CPUキャッシュやSIMD命令で扱いやすいパックド形式は有利となる場合がある。

利点と欠点

利点:

  • パックドであるためメモリの連続アクセスがしやすく、リアルタイム処理での効率が高い場合がある。
  • 4:2:2 のため 4:2:0 よりも色解像度が高く、垂直方向のディテールが要求される映像(放送や一部の業務用映像)で有利。

欠点:

  • バイトオーダー(Y V Y U)が特異なため、フォーマットの取り違えが起きやすく、間違えると色が大きくずれる。
  • プラナル形式と比べて、各成分を個別に処理したいアルゴリズムでは取り扱いが面倒なことがある。
  • 最新のデバイスやAPIでは NV12 や YUV420 系のプラナル形式が標準化される傾向があり、互換性の面で扱いにくいケースがある。

色変換(YUV → RGB)の基礎

表示や画像処理で一般的に必要になるのが YUV から RGB への変換です。代表的な変換式(BT.601 標準的な近似)を示します:

  • R = Y + 1.402 × (V − 128)
  • G = Y − 0.344136 × (U − 128) − 0.714136 × (V − 128)
  • B = Y + 1.772 × (U − 128)

ここで Y, U, V は 0–255 の 8bit 値(映像のレンジがフルレンジかニンブルレンジかでも調整が必要)です。YVYU の場合はバイト列から Y0,V0,Y1,U0 を取り出し、それぞれ対応するピクセルの Y と共有する U/V を用いて上の式で RGB を計算します。

実務上の注意点

  • フォーマット名の揺れ:FourCC 名(例: "YVYU")とライブラリ内のピクセルフォーマット名が異なることがある。API(V4L2、DirectShow、FFmpeg、GStreamer 等)ごとに名称とバイト順を確認すること。
  • 色域とレンジ:BT.601 と BT.709 など色域やリミテッドレンジ(16–235)/フルレンジ(0–255)の違いが表示結果に影響するので、映像ソースの規格を確認すること。
  • アルファチャンネルは無い:YVYU は YUV 色空間の 4:2:2 のパックド形式であり、アルファは含まれない。
  • ラインストライド(stride/rowpitch)の扱い:各行のバイト幅は幅(ピクセル数)に依存する。横幅が奇数の場合でも 4 バイト単位の配置が要求される実装があるので注意。

ライブラリ/ツールでの扱い方(例示)

主要なマルチメディアライブラリやツールでは YVYU を扱うための仕組みが用意されていますが、フォーマット名が分かりにくいことがあるため実装例を把握しておくと便利です。

  • FFmpeg/libav:FourCC 名やピクセルフォーマット名(packed 形式の名前)で指定可能。ドライバやファイルコンテナに応じて内部で適切な変換が行われることが多い。
  • OpenCV:VideoCapture で取得したフレームは多くの場合 BGR に変換されて返される(バックエンド依存)。生の YVYU バッファを扱う場合は自前でバイト順を解釈して cv::Mat を作る必要がある。
  • GStreamer:caps で pixel-aspect や format(例: YVYU)を指定してパイプラインを構築できる。videoconvert による自動変換が利用できる。
  • V4L2(Linux カメラ API):V4L2_PIX_FMT_YVYU などの定義があり、キャプチャ時のフォーマット指定に使われる。

トラブルシューティングのヒント

  • 色が反転(赤と青が入れ替わる/色味がおかしい):U と V の取り違え、またはバイト順の誤解が多くの原因。
  • 横方向に色がずれて見える:サブサンプリングの誤処理(例えば 4:2:2 と 4:2:0 の混同)やラインピッチの誤りが原因。
  • モザイクやノイズが出る:Y と UV が別々に揃っていない(stride の誤りやバッファアライメント)可能性。

将来性と実際の現場での採用状況

YVYU のような古典的なパックド 4:2:2 フォーマットは、組み込みデバイスやレガシーなキャプチャ機器、放送機器などで現在も一定の需要があります。一方で、クラウドベースの映像処理やモダンなハードウェアアクセラレーション環境では、NV12 や他のプラナル形式が好まれる傾向があります。そのため、新規システム設計においては互換性・性能・エコシステム(使用するライブラリやハードウェアのサポート)を踏まえてフォーマット選定を行うのが現実的です。

まとめ

YVYU は「Y V Y U」の順でバイトを並べるパックドな YUV 4:2:2 フォーマットで、ビデオキャプチャやリアルタイム映像処理の場面で使われることがあります。扱う際はバイトオーダーの違いや色域・レンジの取り扱いに注意し、使用するライブラリやデバイスの仕様に従って正確に解釈・変換することが重要です。

参考文献