Types de vidéos H.264

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Les sous-types de média suivants sont définis pour la vidéo H.264.

Subtype FOURCC Description
MEDIASUBTYPE_AVC1 'AVC1' Flux de bits H.264 sans codes de début.
MEDIASUBTYPE_H264 'H264' Flux de bits H.264 avec codes de début.
MEDIASUBTYPE_h264 'h264' Équivalent à MEDIASUBTYPE_H264, avec un FOURCC différent.
MEDIASUBTYPE_X264 'X264' Équivalent à MEDIASUBTYPE_H264, avec un FOURCC différent.
MEDIASUBTYPE_x264 'x264' Équivalent à MEDIASUBTYPE_H264, avec un FOURCC différent.

 

Ces GUID de sous-type sont déclarés dans wmcodecdsp.h.

La main différence entre ces types de médias est la présence de codes de démarrage dans le flux de bits. Si le sous-type est MEDIASUBTYPE_AVC1, le flux de bits ne contient pas de codes de démarrage.

Flux de bits H.264 avec codes de démarrage

Les flux de bits H.264 transmis par voie aérienne, ou contenus dans des programmes ou des flux de transport MPEG-2, ou enregistrés sur HD-DVD, sont mis en forme comme décrit dans l’Annexe B de la Rec. UIT-T H.264. Selon cette spécification, le flux de bits se compose d’une séquence d’unités de couche d’abstraction réseau (NALUs), chacune d’elles étant précédée d’un code de début égal à 0x000001 ou 0x00000001.

Lorsque des codes de démarrage sont présents dans le flux de bits, le type de média suivant est utilisé :

Étiquette Valeur
Type principal MEDIATYPE_Video
Sous-types MEDIASUBTYPE_H264, MEDIASUBTYPE_h264, MEDIASUBTYPE_X264 ou MEDIASUBTYPE_x264
Type de format FORMAT_VideoInfo, FORMAT_VideoInfo2, FORMAT_MPEG2Video ou GUID_NULL

 

Si le type de format est GUID_NULL, aucune structure de format n’est présente.

Lorsque le flux binaire contient des codes de démarrage, l’un des types de format répertoriés ici est suffisant, car le décodeur n’a pas besoin d’informations supplémentaires pour analyser le flux. Le flux binaire contient déjà toutes les informations requises par le décodeur, et les codes de démarrage permettent au décodeur de localiser le début de chaque NALU.

Les sous-types suivants sont équivalents :

Flux de bits H.264 sans codes de démarrage

Le format de conteneur MP4 stocke les données H.264 sans codes de démarrage. Au lieu de cela, chaque NALU est précédé d’un champ de longueur, qui donne la longueur de la NALU en octets. La taille du champ de longueur peut varier, mais est généralement de 1, 2 ou 4 octets.

Lorsque les codes de démarrage ne sont pas présents dans le flux de bits, le type de média suivant est utilisé.

Étiquette Valeur
Type principal MEDIATYPE_Video
Subtype MEDIASUBTYPE_AVC1
Type de format FORMAT_MPEG2Video

 

Le bloc de format est une structure MPEG2VIDEOINFO . Cette structure doit être remplie comme suit :

  • hdr : structure VIDEOINFOHEADER2 qui décrit le flux de bits. Aucune table de couleurs n’est présente après la partie BITMAPINFOHEADER de la structure, et biClrUsed doit être égal à zéro.
  • dwStartTimeCode : non utilisé. Définit la valeur zéro.
  • cbSequenceHeader : longueur du tableau dwSequenceHeader en octets.
  • dwProfile : spécifie le profil H.264.
  • dwLevel : spécifie le niveau H.264.
  • dwFlags : nombre d’octets utilisés pour le champ de longueur qui apparaît avant chaque NALU. Le champ de longueur indique la taille de la NALU suivante en octets. Par exemple, si dwFlags a la valeur 4, chaque NALU est précédé d’un champ de longueur de 4 octets. Les valeurs valides sont 1, 2 et 4.
  • dwSequenceHeader : tableau d’octets qui peut contenir un jeu de paramètres de séquence (SPS) et un jeu de paramètres d’image (PPS).

Le conteneur MP4 peut contenir des jeux de paramètres de séquence (SPS) ou des jeux de paramètres d’image (PPS) sous forme d’unités NAL spéciales dans les en-têtes de fichier ou dans un flux distinct (distinct du flux vidéo). Lorsque le format est établi, le type de média peut spécifier des unités SPS et PPS NAL dans le tableau dwSequenceHeader . Si cbSequenceHeader est supérieur à zéro, dwSequenceHeader est le début d’un tableau d’octets contenant des NALUS SPS et PPS, délimités par des champs de longueur de 2 octets, le tout dans l’ordre d’octets réseau (big-endian). Il est possible d’avoir à la fois SPS et PPS, un seul de ces types, ou aucun. Le type réel de chaque NALU peut être déterminé en examinant le champ nal_unit_type de la NALU elle-même.

Lorsque ce type de média est utilisé, chaque exemple de média commence au début d’une NALU, et les unités NAL ne couvrent pas les exemples. Cela permet au décodeur de récupérer en cas d’altération des données ou de suppression d’échantillons.