Tipos de vídeo H.264

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Os subtipos de mídia a seguir são definidos para vídeo H.264.

Subtype FOURCC Descrição
MEDIASUBTYPE_AVC1 'AVC1' H.264 bitstream sem códigos de início.
MEDIASUBTYPE_H264 'H264' H.264 bitstream com códigos iniciais.
MEDIASUBTYPE_h264 'h264' Equivalente a MEDIASUBTYPE_H264, com um FOURCC diferente.
MEDIASUBTYPE_X264 'X264' Equivalente a MEDIASUBTYPE_H264, com um FOURCC diferente.
MEDIASUBTYPE_x264 'x264' Equivalente a MEDIASUBTYPE_H264, com um FOURCC diferente.

 

Esses GUIDs de subtipo são declarados em wmcodecdsp.h.

A diferença main entre esses tipos de mídia é a presença de códigos de início no bitstream. Se o subtipo for MEDIASUBTYPE_AVC1, o bitstream não conterá códigos de início.

H.264 Bitstream com códigos iniciais

Os fluxos de bits H.264 transmitidos pelo ar ou contidos em fluxos de transporte ou programa MPEG-2, ou gravados em HD-DVD, são formatados conforme descrito no Anexo B de ITU-T Rec. H.264. De acordo com essa especificação, o bitstream consiste em uma sequência de NALUs (unidades de camada de abstração de rede), cada uma prefixada com um código inicial igual a 0x000001 ou 0x00000001.

Quando os códigos de início estão presentes no bitstream, o seguinte tipo de mídia é usado:

Rótulo Valor
Tipo principal MEDIATYPE_Video
Subtipos MEDIASUBTYPE_H264, MEDIASUBTYPE_h264, MEDIASUBTYPE_X264 ou MEDIASUBTYPE_x264
Tipo de formato FORMAT_VideoInfo, FORMAT_VideoInfo2, FORMAT_MPEG2Video ou GUID_NULL

 

Se o tipo de formato for GUID_NULL, nenhuma estrutura de formato estará presente.

Quando o bitstream contém códigos de início, qualquer um dos tipos de formato listados aqui é suficiente, pois o decodificador não requer informações adicionais para analisar o fluxo. O bitstream já contém todas as informações necessárias para o decodificador e os códigos de início permitem que o decodificador localize o início de cada NALU.

Os seguintes subtipos são equivalentes:

H.264 Bitstream sem códigos de início

O formato de contêiner MP4 armazena dados H.264 sem códigos de início. Em vez disso, cada NALU é prefixado por um campo de comprimento, que fornece o comprimento da NALU em bytes. O tamanho do campo de comprimento pode variar, mas normalmente é de 1, 2 ou 4 bytes.

Quando os códigos de início não estão presentes no bitstream, o tipo de mídia a seguir é usado.

Rótulo Valor
Tipo principal MEDIATYPE_Video
Subtype MEDIASUBTYPE_AVC1
Tipo de formato FORMAT_MPEG2Video

 

O bloco de formato é uma estrutura MPEG2VIDEOINFO . Essa estrutura deve ser preenchida da seguinte maneira:

  • hdr: uma estrutura VIDEOINFOHEADER2 que descreve o bitstream. Nenhuma tabela de cores está presente após a parte BITMAPINFOHEADER da estrutura e biClrUsed deve ser zero.
  • dwStartTimeCode: não usado. Defina como zero.
  • cbSequenceHeader: o comprimento da matriz dwSequenceHeader em bytes.
  • dwProfile: especifica o perfil H.264.
  • dwLevel: especifica o nível H.264.
  • dwFlags: o número de bytes usados para o campo de comprimento exibido antes de cada NALU. O campo de comprimento indica o tamanho da NALU a seguir em bytes. Por exemplo, se dwFlags for 4, cada NALU será precedido por um campo de comprimento de 4 bytes. Os valores válidos são 1, 2 e 4.
  • dwSequenceHeader: uma matriz de bytes que pode conter SPS (conjunto de parâmetros de sequência) e NALUs PPS (conjunto de parâmetros de imagem).

O contêiner MP4 pode conter conjuntos de parâmetros de sequência (SPS) ou PPS (conjuntos de parâmetros de imagem) como unidades NAL especiais em cabeçalhos de arquivo ou em um fluxo separado (diferente do fluxo de vídeo). Quando o formato é estabelecido, o tipo de mídia pode especificar unidades NAL SPS e PPS na matriz dwSequenceHeader . Se cbSequenceHeader for maior que zero, dwSequenceHeader será o início de uma matriz de bytes que contém NALUs de SPS e PPS, delimitada por campos de comprimento de 2 bytes, tudo em ordem de byte de rede (big-endian). É possível ter SPS e PPS, apenas um desses tipos ou nenhum. O tipo real de cada NALU pode ser determinado examinando o campo nal_unit_type da própria NALU.

Quando esse tipo de mídia é usado, cada exemplo de mídia começa no início de uma NALU e as unidades NAL não abrangem amostras. Isso permite que o decodificador se recupere de dados corrompidos ou amostras descartadas.