Tipi di video H.264

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Per il video H.264 sono definiti i seguenti sottotipi multimediali.

Subtype FOURCC Descrizione
MEDIASUBTYPE_AVC1 'AVC1' H.264 bitstream senza codici di avvio.
MEDIASUBTYPE_H264 'H264' H.264 bitstream con codici iniziale.
MEDIASUBTYPE_h264 'h264' Equivalente a MEDIASUBTYPE_H264, con un FOURCC diverso.
MEDIASUBTYPE_X264 'X264' Equivalente a MEDIASUBTYPE_H264, con un FOURCC diverso.
MEDIASUBTYPE_x264 'x264' Equivalente a MEDIASUBTYPE_H264, con un FOURCC diverso.

 

Questi GUID di sottotipo vengono dichiarati in wmcodecdsp.h.

La differenza principale tra questi tipi di supporti è la presenza di codici iniziali nel bitstream. Se il sottotipo è MEDIASUBTYPE_AVC1, il bitstream non contiene codici iniziali.

H.264 Bitstream con codici iniziale

H.264 bitstream trasmessi tramite l'aria o contenuti in flussi di trasporto MPEG-2 o registrati in HD-DVD, vengono formattati come descritto nell'allegato B di ITU-T Rec. H.264. In base a questa specifica, il bitstream è costituito da una sequenza di unità livello di astrazione di rete (NALUs), ognuna delle quali è preceduta da un codice iniziale uguale a 0x000001 o 0x00000001.

Quando i codici di avvio sono presenti nel bitstream, viene usato il tipo di supporto seguente:

Etichetta Valore
Tipo principale MEDIATYPE_Video
Sottotipi MEDIASUBTYPE_H264, MEDIASUBTYPE_h264, MEDIASUBTYPE_X264 o MEDIASUBTYPE_x264
Tipo di formato FORMAT_VideoInfo, FORMAT_VideoInfo2, FORMAT_MPEG2Video o GUID_NULL

 

Se il tipo di formato è GUID_NULL, non è presente alcuna struttura di formato.

Quando il bitstream contiene codici iniziali, uno dei tipi di formato elencati qui è sufficiente, perché il decodificatore non richiede informazioni aggiuntive per analizzare il flusso. Il bitstream contiene già tutte le informazioni necessarie dal decodificatore e i codici iniziale consentono al decodificatore di individuare l'inizio di ogni NALU.

I sottotipi seguenti sono equivalenti:

H.264 Bitstream senza codici di avvio

Il formato contenitore MP4 archivia i dati H.264 senza codici di avvio. Invece, ogni NALU è preceduto da un campo di lunghezza, che dà la lunghezza del NALU in byte. Le dimensioni del campo di lunghezza possono variare, ma in genere sono 1, 2 o 4 byte.

Quando i codici di avvio non sono presenti nel bitstream, viene usato il tipo di supporto seguente.

Etichetta Valore
Tipo principale MEDIATYPE_Video
Subtype MEDIASUBTYPE_AVC1
Tipo di formato FORMAT_MPEG2Video

 

Il blocco di formato è una struttura MPEG2VIDEOINFO . Questa struttura deve essere compilata come segue:

  • hdr: struttura VIDEOINFOHEADER2 che descrive il bitstream. Nessuna tabella di colori è presente dopo la parte BITMAPINFOHEADER della struttura e biClrUsed deve essere zero.
  • dwStartTimeCode: non usato. Imposta su zero.
  • cbSequenceHeader: lunghezza della matrice dwSequenceHeader in byte.
  • dwProfile: specifica il profilo H.264.
  • dwLevel: specifica il livello H.264.
  • dwFlags: numero di byte usati per il campo di lunghezza visualizzato prima di ogni NALU. Il campo lunghezza indica le dimensioni del codice NALU seguente in byte. Ad esempio, se dwFlags è 4, ogni NALU è preceduto da un campo di lunghezza a 4 byte. I valori validi sono 1, 2 e 4.
  • dwSequenceHeader: matrice di byte che può contenere set di parametri di sequenza (SPS) e set di parametri immagine (PPS).

Il contenitore MP4 può contenere set di parametri di sequenza (SPS) o set di parametri immagine (PPS) come unità NAL speciali nelle intestazioni di file o in un flusso separato (distinto dal flusso video). Quando viene stabilito il formato, il tipo di supporto può specificare le unità SPS e PPS NAL nella matrice dwSequenceHeader . Se cbSequenceHeader è maggiore di zero, dwSequenceHeader è l'inizio di una matrice di byte contenente SPS e PPS NALUs, delimitata da campi di lunghezza a 2 byte, tutti in ordine di byte di rete (big-endian). È possibile avere sia SPS che PPS, solo uno di questi tipi o nessuno. Il tipo effettivo di ogni NALU può essere determinato esaminando il campo nal_unit_type del NALU stesso.

Quando viene usato questo tipo di supporto, ogni esempio multimediale inizia all'inizio di un'unità NALU e NAL non si estende su campioni. In questo modo il decodificatore può recuperare dal danneggiamento dei dati o eliminare campioni.