H.264 视频类型
[与此页面关联的功能(DirectShow)是一项旧功能。 它已被 MediaPlayer、IMFMediaEngine取代,并在媒体基金会 音频/视频捕获。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 MediaPlayer、IMFMediaEngine 和 Media 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_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 个字节。
当位流中不存在启动代码时,将使用以下媒体类型。
标签 | 价值 |
---|---|
主要类型 | MEDIATYPE_Video |
亚 | MEDIASUBTYPE_AVC1 |
格式类型 | FORMAT_MPEG2Video |
格式块是 MPEG2VIDEOINFO 结构。 应按如下所示填充此结构:
- hdr:描述位流的 VIDEOINFOHEADER2 结构。 结构部分BITMAPINFOHEADER 之后不存在颜色表,biClrUsed 必须为零。
- dwStartTimeCode:未使用。 设置为零。
- cbSequenceHeader:dwSequenceHeader 数组的长度(以字节为单位)。
- 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 单元不会跨越样本。 这使解码器能够从数据损坏或删除样本中恢复。