H.264 视频类型

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 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 中声明。

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

具有起始代码的 H.264 Bitstream

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

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

Label
主要类型 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 个字节。

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

Label
主要类型 MEDIATYPE_Video
子类型 MEDIASUBTYPE_AVC1
格式类型 FORMAT_MPEG2Video

 

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

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

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

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