H.264 ビデオの種類

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayerIMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]

H.264 ビデオでは、次のメディア サブタイプが定義されています。

Subtype FOURCC 説明
MEDIASUBTYPE_AVC1 'AVC1' 開始コードのない H.264 ビットストリーム。
MEDIASUBTYPE_H264 'H264' 開始コードを含む H.264 ビットストリーム。
MEDIASUBTYPE_h264 'h264' 別の FOURCC を使用するMEDIASUBTYPE_H264と同等です。
MEDIASUBTYPE_X264 'X264' 別の FOURCC を使用するMEDIASUBTYPE_H264と同等です。
MEDIASUBTYPE_x264 'x264' 別の FOURCC を使用するMEDIASUBTYPE_H264と同等です。

 

これらのサブタイプ GUID は wmcodecdsp.h で宣言されています。

これらのメディアの種類のメイン違いは、ビットストリームに開始コードが存在することです。 サブタイプが MEDIASUBTYPE_AVC1の場合、ビットストリームには開始コードは含まれません。

開始コードを含む H.264 ビットストリーム

空中で送信される H.264 ビットストリーム、または MPEG-2 プログラムまたはトランスポート ストリームに含まれているか、HD-DVD に記録されている H.264 ビットストリームは、ITU-T Rec. H.264 の付属書 B で説明されているように書式設定されています。 この仕様によると、ビットストリームはネットワーク抽象化レイヤー ユニット (NALU) のシーケンスで構成され、各ユニットには、0x000001または0x00000001と等しい開始コードがプレフィックスとして付けられます。

ビットストリームに開始コードが存在する場合は、次のメディアの種類が使用されます。

Label
メジャーの種類 MEDIATYPE_Video
サブタイプ MEDIASUBTYPE_H264MEDIASUBTYPE_h264MEDIASUBTYPE_X264、または MEDIASUBTYPE_x264
形式の種類 FORMAT_VideoInfoFORMAT_VideoInfo2FORMAT_MPEG2Video、または GUID_NULL

 

書式の種類が GUID_NULL場合、書式構造は存在しません。

ビットストリームに開始コードが含まれている場合、デコーダーはストリームを解析するために追加情報を必要としないため、ここに記載されている形式の種類で十分です。 ビットストリームにはデコーダーに必要なすべての情報が既に含まれており、開始コードによりデコーダーは各 NALU の開始位置を見つけることができます。

次のサブタイプは同等です。

開始コードのない H.264 ビットストリーム

MP4 コンテナー形式では、開始コードなしで H.264 データが格納されます。 代わりに、各 NALU の前に長さフィールドが付けられます。これにより、NALU の長さがバイト単位で示されます。 長さフィールドのサイズはさまざまですが、通常は 1、2、または 4 バイトです。

ビットストリームに開始コードが存在しない場合は、次のメディアの種類が使用されます。

Label
メジャーの種類 MEDIATYPE_Video
Subtype MEDIASUBTYPE_AVC1
形式の種類 FORMAT_MPEG2Video

 

フォーマット ブロックは MPEG2VIDEOINFO 構造体です。 この構造体は、次のように入力する必要があります。

  • hdr: ビットストリームを記述する VIDEOINFOHEADER2 構造体。 構造体の BITMAPINFOHEADER 部分の後にカラー テーブルが存在せず、 biClrUsed は 0 である必要があります。
  • dwStartTimeCode: 使用されません。 0 に設定します。
  • cbSequenceHeader: dwSequenceHeader 配列の長さ (バイト単位)。
  • dwProfile: H.264 プロファイルを指定します。
  • dwLevel: H.264 レベルを指定します。
  • dwFlags: 各 NALU の前に表示される長さフィールドに使用されるバイト数。 length フィールドは、次の NALU のサイズをバイト単位で示します。 たとえば、 dwFlags が 4 の場合、各 NALU の前には 4 バイトの長さフィールドが付く必要があります。 有効な値は 1、2、4 です。
  • dwSequenceHeader: シーケンス パラメーター セット (SPS) とピクチャ パラメーター セット (PPS) NALU を含むバイト配列。

MP4 コンテナーには、シーケンス パラメーター セット (SPS) またはピクチャ パラメーター セット (PPS) が、ファイル ヘッダーまたは別のストリーム (ビデオ ストリームとは異なる) の特殊な NAL ユニットとして含まれる場合があります。 形式が確立されると、メディアの種類は dwSequenceHeader 配列で SPS および PPS NAL 単位を指定できます。 cbSequenceHeader が 0 より大きい場合、dwSequenceHeader は SPS と PPS NALU を含むバイト配列の先頭で、2 バイトの長さのフィールドで区切られ、すべてネットワーク バイト順 (ビッグ エンディアン) で区切られます。 SPS と PPS の両方を使用することも、これらの種類の 1 つだけにすることも、まったく持たなかったりすることも可能です。 各 NALU の実際の型は、NALU 自体の nal_unit_type フィールドを調べることで決定できます。

このメディアの種類を使用すると、各メディア サンプルは NALU の先頭から開始され、NAL ユニットはサンプルにまたがりません。 これにより、デコーダーはデータの破損やサンプルの削除から回復できます。