H.264 视频类型
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 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_H264、 MEDIASUBTYPE_h264、 MEDIASUBTYPE_X264 或 MEDIASUBTYPE_x264 |
格式类型 | FORMAT_VideoInfo、 FORMAT_VideoInfo2、 FORMAT_MPEG2Video 或 GUID_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:未使用。 设置为零。
- cbSequenceHeader: dwSequenceHeader 数组的长度(以字节为单位)。
- 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 单位不跨越样本。 这使解码器能够从数据损坏或删除的样本中恢复。