H.264 视频类型

[与此页面关联的功能(DirectShow)是一项旧功能。 它已被 MediaPlayerIMFMediaEngine取代,并在媒体基金会 音频/视频捕获。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获,而不是 DirectShow。 Microsoft建议重写使用旧 API 的现有代码,以尽可能使用新 API。]

为 H.264 视频定义了以下媒体子类型。

FOURCC 描述
MEDIASUBTYPE_AVC1 “AVC1” 没有启动代码的 H.264 位流。
MEDIASUBTYPE_H264 “H264” 带开始代码的 H.264 位流。
MEDIASUBTYPE_h264 “h264” 等效于 MEDIASUBTYPE_H264,具有不同的 FOURCC。
MEDIASUBTYPE_X264 “X264” 等效于 MEDIASUBTYPE_H264,具有不同的 FOURCC。
MEDIASUBTYPE_x264 “x264” 等效于 MEDIASUBTYPE_H264,具有不同的 FOURCC。

 

这些子类型 GUID 在 wmcodecdsp.h 中声明。

这些媒体类型之间的主要区别在于位流中存在启动代码。 如果子类型 MEDIASUBTYPE_AVC1,则位流不包含起始代码。

带开始代码的 H.264 Bitstream

通过空中传输的 H.264 位流(或包含在 MPEG-2 程序或传输流中)或 HD-DVD 上录制的 H.264 位流的格式设置,如 ITU-T Rec. H.264 的附件 B 中所述。 根据此规范,位流由一系列网络抽象层单元(NALUs)组成,其中每个单元的前缀为起始代码等于0x000001或0x00000001。

当位流中存在启动代码时,将使用以下媒体类型:

标签 价值
主要类型 MEDIATYPE_Video
MEDIASUBTYPE_H264MEDIASUBTYPE_h264MEDIASUBTYPE_X264MEDIASUBTYPE_x264
格式类型 FORMAT_VideoInfoFORMAT_VideoInfo2FORMAT_MPEG2VideoGUID_NULL

 

如果格式类型 GUID_NULL,则不存在格式结构。

当位流包含起始代码时,此处列出的任何格式类型都足够,因为解码器不需要任何其他信息来分析流。 位流已包含解码器所需的所有信息,开始代码使解码器能够找到每个 NALU 的开头。

以下子类型等效:

没有启动代码的 H.264 位流

MP4 容器格式存储 H.264 数据,无需启动代码。 相反,每个 NALU 都以长度字段为前缀,该字段以字节为单位提供 NALU 的长度。 长度字段的大小可能会有所不同,但通常为 1、2 或 4 个字节。

当位流中不存在启动代码时,将使用以下媒体类型。

标签 价值
主要类型 MEDIATYPE_Video
MEDIASUBTYPE_AVC1
格式类型 FORMAT_MPEG2Video

 

格式块是 MPEG2VIDEOINFO 结构。 应按如下所示填充此结构:

  • hdr:描述位流的 VIDEOINFOHEADER2 结构。 结构部分BITMAPINFOHEADER 之后不存在颜色表,biClrUsed 必须为零。
  • dwStartTimeCode:未使用。 设置为零。
  • cbSequenceHeaderdwSequenceHeader 数组的长度(以字节为单位)。
  • dwProfile:指定 H.264 配置文件。
  • dwLevel:指定 H.264 级别。
  • dwFlags:用于每个 NALU之前显示的长度字段的字节数。 长度字段指示以下 NALU 的大小(以字节为单位)。 例如,如果 dwFlags 为 4,则每个 NALU 前面有一个 4 字节长度字段。 有效值为 1、2 和 4。
  • dwSequenceHeader:可能包含序列参数集(SPS)和图片参数集(PPS)NALU 的字节数组。

MP4 容器可能包含序列参数集(SPS)或图片参数集(PPS)作为文件标头或单独的流(不同于视频流)的特殊 NAL 单元。 建立格式后,媒体类型可以在 dwSequenceHeader 数组中指定 SPS 和 PPS NAL 单元。 如果 cbSequenceHeader 大于零,dwSequenceHeader 是包含 SPS 和 PPS NALU 的字节数组的开头,以 2 字节长度字段分隔,全部采用网络字节顺序(big-endian)。 可以同时具有 SPS 和 PPS(只有这些类型之一或无)。 可以通过检查 NALU 本身的 nal_unit_type 字段来确定每个 NALU 的实际类型。

使用此媒体类型时,每个媒体示例从 NALU 的开头开始,NAL 单元不会跨越样本。 这使解码器能够从数据损坏或删除样本中恢复。