Freigeben über


H.264-Videotypen

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

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

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

 

Diese Untertyp-GUIDs werden in wmcodecdsp.h deklariert.

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

H.264-Bitstream mit Startcodes

H.264-Bitstreams, die über die Luft übertragen werden oder in MPEG-2-Programm- oder Transportstreams enthalten sind oder auf HD-DVD aufgezeichnet werden, sind wie in Anhang B von ITU-T Rec. H.264 beschrieben formatiert. Gemäß dieser Spezifikation besteht der Bitstream aus einer Sequenz von Netzwerkabstraktionsebeneneinheiten (NALUs), die jeweils einem Startcode gleich 0x000001 oder 0x00000001 vorangestellt sind.

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

Etikett Wert
Haupttyp MEDIATYPE_Video
Subtypen MEDIASUBTYPE_H264, MEDIASUBTYPE_h264, MEDIASUBTYPE_X264oder MEDIASUBTYPE_x264
Formattyp FORMAT_VideoInfo, FORMAT_VideoInfo2, FORMAT_MPEG2Videooder GUID_NULL

 

Wenn der Formattyp GUID_NULList, ist keine Formatstruktur vorhanden.

Wenn der Bitstream Startcodes enthält, reicht jeder der hier aufgeführten Formattypen aus, da der Decoder keine zusätzlichen Informationen benötigt, um den Datenstrom zu analysieren. Der Bitstream enthält bereits alle vom Decoder benötigten Informationen, und die Startcodes ermöglichen es dem Decoder, den Start jedes NALU zu finden.

Die folgenden Untertypen sind gleichwertig:

H.264-Bitstream ohne Startcodes

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

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

Etikett Wert
Haupttyp MEDIATYPE_Video
Subtyp 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 festgelegt.
  • cbSequenceHeader: Die Länge des dwSequenceHeader-Arrays in Byte.
  • dwProfile-: Gibt das H.264-Profil an.
  • dwLevel-: Gibt die Ebene H.264 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 z. B. dwFlags 4 ist, wird jedem NALU ein 4-Byte-Längenfeld vorangestellt. Die gültigen Werte sind 1, 2 und 4.
  • dwSequenceHeader-: Ein Bytearray, das Sequenzparametersatz (SPS) und Bildparametersatz (PPS) NALUs enthalten kann.

Der MP4-Container kann Sequenzparametersätze (SPS) oder Bildparametersätze (PPS) als spezielle NAL-Einheiten in Dateiheadern oder in einem separaten Datenstrom (getrennt vom Videostream) enthalten. Wenn das Format eingerichtet wird, kann der Medientyp SPS- und PPS-NAL-Einheiten im dwSequenceHeader Array angeben. Wenn cbSequenceHeader- größer als Null ist, ist dwSequenceHeader der Anfang eines Bytearrays, das SPS- und PPS-NALUs enthält, durch 2-Byte-Längenfelder getrennt, alle in Netzwerkbytereihenfolge (big-endian). Es ist möglich, sowohl SPS als auch PPS, nur einen dieser Typen oder keines zu haben. Der tatsächliche Typ der einzelnen NALU kann bestimmt werden, indem das nal_unit_type Feld der NALU selbst untersucht wird.

Wenn dieser Medientyp verwendet wird, beginnt jedes Medienbeispiel am Anfang eines NALU, und NAL-Einheiten umfassen keine Beispiele. Auf diese Weise kann der Decoder datenbeschädigungs- oder verworfene Beispiele wiederherstellen.