H.264-Videotypen

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

Die folgenden Medienuntertypen sind für H.264-Video definiert.

Subtype FOURCC BESCHREIBUNG
MEDIASUBTYPE_AVC1 "AVC1" H.264-Bitstream ohne Startcodes.
MEDIASUBTYPE_H264 "H264" H.264-Bitstream mit Startcodes.
MEDIASUBTYPE_h264 'h264' Entspricht MEDIASUBTYPE_H264 mit einem anderen FOURCC.
MEDIASUBTYPE_X264 'X264' Entspricht MEDIASUBTYPE_H264 mit einem anderen FOURCC.
MEDIASUBTYPE_x264 'x264' Entspricht MEDIASUBTYPE_H264 mit einem anderen FOURCC.

 

Diese Untertyp-GUIDs werden in wmcodecdsp.h deklariert.

Der Standard Unterschied zwischen diesen Medientypen ist das Vorhandensein von Startcodes im Bitstream. Wenn der Untertyp MEDIASUBTYPE_AVC1 ist, enthält der Bitstream keine Startcodes.

H.264-Bitstream mit Startcodes

H.264-Bitströme, die über die Luft übertragen oder in MPEG-2-Programm- oder Transportstreams enthalten oder auf HD-DVD aufgezeichnet werden, werden wie in Anhang B des ITU-T Rec. H.264 beschrieben formatiert. Gemäß dieser Spezifikation besteht der Bitstream aus einer Sequenz von Netzwerkabstraktionsebeneneinheiten (Network Abstraction Layer Units, NALUs), denen jedem ein Startcode vorangestellt ist, der 0x000001 oder 0x00000001.

Wenn Startcodes im Bitstream vorhanden sind, wird der folgende Medientyp verwendet:

Bezeichnung Wert
Haupttyp MEDIATYPE_Video
Untertypen MEDIASUBTYPE_H264, MEDIASUBTYPE_h264, MEDIASUBTYPE_X264 oder MEDIASUBTYPE_x264
Formattyp FORMAT_VideoInfo, FORMAT_VideoInfo2, FORMAT_MPEG2Video oder GUID_NULL

 

Wenn der Formattyp GUID_NULL ist, ist keine Formatstruktur vorhanden.

Wenn der Bitstream Startcodes enthält, ist jeder der hier aufgeführten Formattypen ausreichend, da der Decoder keine zusätzlichen Informationen benötigt, um den Stream zu analysieren. Der Bitstream enthält bereits alle informationen, die der Decoder benötigt, und die Startcodes ermöglichen es dem Decoder, den Start der einzelnen NALU zu finden.

Die folgenden Untertypen sind gleichwertig:

H.264-Bitstream ohne Startcodes

Das MP4-Containerformat speichert H.264-Daten ohne Startcodes. Stattdessen wird jeder NALU ein Längenfeld vorangestellt, das die Länge der NALU in Bytes angibt. Die Größe des Längenfelds kann variieren, beträgt aber in der Regel 1, 2 oder 4 Bytes.

Wenn im Bitstream keine Startcodes vorhanden sind, wird der folgende Medientyp verwendet.

Bezeichnung Wert
Haupttyp MEDIATYPE_Video
Subtype MEDIASUBTYPE_AVC1
Formattyp FORMAT_MPEG2Video

 

Der Formatblock ist eine MPEG2VIDEOINFO-Struktur . Diese Struktur sollte wie folgt ausgefüllt werden:

  • hdr: Eine VIDEOINFOHEADER2-Struktur , die den Bitstream beschreibt. Nach dem BITMAPINFOHEADER-Teil der Struktur ist keine Farbtabelle vorhanden, und biClrUsed muss null sein.
  • dwStartTimeCode: Nicht verwendet. Auf NULL festlegen.
  • cbSequenceHeader: Die Länge des dwSequenceHeader-Arrays in Bytes.
  • dwProfile: Gibt das H.264-Profil an.
  • dwLevel: Gibt die H.264-Ebene an.
  • dwFlags: Die Anzahl der Bytes, die für das Längenfeld verwendet werden, das vor jedem NALU angezeigt wird. Das Längenfeld gibt die Größe der folgenden NALU in Byte an. Wenn dwFlags beispielsweise 4 ist, wird jeder NALU ein Feld mit einer Länge von 4 Byte vorangestellt. Die gültigen Werte sind 1, 2 und 4.
  • dwSequenceHeader: Ein Bytearray, das NALUs (Sequence Parameter Set, SPS) und Picture Parameter Set (PPS) enthalten kann.

Der MP4-Container kann Sequenzparametersätze (SPS) oder Bildparametersätze (PPS) als spezielle NAL-Einheiten in Dateiheadern oder in einem separaten Stream (anders als der Videostream) enthalten. Wenn das Format festgelegt ist, kann der Medientyp SPS- und PPS-NAL-Einheiten im dwSequenceHeader-Array angeben. Wenn cbSequenceHeader größer als 0 (null) ist, ist dwSequenceHeader der Anfang eines Bytearrays, das SPS- und PPS-NALUs enthält, getrennt durch Felder mit einer Länge von 2 Byte, alle in Netzwerkbytereihenfolge (big-endian). Es ist möglich, sowohl SPS als auch PPS zu verwenden, nur einen dieser Typen oder keinen. Der tatsächliche Typ der einzelnen NALU kann durch Untersuchung des nal_unit_type Felds der NALU selbst bestimmt werden.

Wenn dieser Medientyp verwendet wird, beginnt jedes Medienbeispiel am Anfang einer NALU, und NAL-Einheiten umfassen keine Beispiele. Dadurch kann der Decoder nach Datenbeschädigungen oder gelöschten Beispielen wiederhergestellt werden.