H.264 视频编码器

Microsoft Media Foundation H.264 视频编码器是支持以下 H.264 配置文件的 媒体基础转换

  • 基线配置文件
  • Main Profile
  • 高调 (需要Windows 8)

H.264 视频编码器公开以下接口:

输入类型

输入媒体类型必须具有以下子类型之一:

  • MFVideoFormat_I420
  • MFVideoFormat_IYUV
  • MFVideoFormat_NV12
  • MFVideoFormat_YUY2
  • MFVideoFormat_YV12

有关这些子类型的详细信息,请参阅 视频子类型 GUID

输出类型必须在输入类型之前设置。 在设置输出类型之前,编码器的 IMFTransform::SetInputType 方法将返回 MF_E_TRANSFORM_TYPE_NOT_SET

输出类型

编码器支持单个输出子类型:

  • MFVideoFormat_H264

在输出媒体类型上设置以下属性。

Attribute 说明
MF_MT_MAJOR_TYPE 主要类型。 必须 MFMediaType_Video
MF_MT_SUBTYPE 视频子类型。 必须 MFVideoFormat_H264
MF_MT_AVG_BITRATE 平均编码比特率,以比特/秒为单位。 必须大于零。
MF_MT_FRAME_RATE 帧速率。
MF_MT_FRAME_SIZE 帧大小。
MF_MT_INTERLACE_MODE 交错模式。
MF_MT_MPEG2_PROFILE H.264 编码配置文件。
支持的值包括:
  • eAVEncH264VProfile_Base (默认)
  • eAVEncH264VProfile_Main
  • eAVEncH264VProfile_High (需要Windows 8)
MF_MT_MPEG2_LEVEL 可选。 指定 H.264 编码级别。
默认值为 –1,表示编码器将选择编码级别。
建议不要在媒体类型中设置级别,并允许编码器选择级别。 编码器可以为给定视频流派生适当的级别,同时考虑到视频的格式约束和特征。 有关配置文件和级别约束的详细信息,请参阅ITU-T H.264 的附件 A。
MF_MT_PIXEL_ASPECT_RATIO 可选。 指定像素纵横比。 默认值为 1:1。

 

设置输出类型后,视频编码器通过添加 MF_MT_MPEG_SEQUENCE_HEADER 属性来更新类型。 此属性包含序列标头。

编解码器属性

H.264 编码器实现用于设置编码参数的 ICodecAPI 接口。 它支持以下属性。

有关 HCK 编码器认证的编解码器要求,请参阅下面的 认证硬件编码器 部分。

Windows 7 支持以下属性。

属性 说明
CODECAPI_AVEncCommonRateControlMode 设置速率控制模式。 请参阅“备注”。 默认模式是无约束的可变比特率 (VBR) 。
CODECAPI_AVEncCommonQuality 设置质量级别。 当速率控制模式是基于质量的 VBR (eAVEncCommonRateControlMode_Quality) 时,此属性适用。 有效范围为 1–100。 默认值为 70。
若要设置此参数,请在调用 IMFTransform::SetOutputType 之前设置 属性。
若要在 Windows 7 中设置此参数,请在调用 IMFTransform::SetOutputType 之前设置 属性。 设置输出类型后,编码器将忽略更改。
在 Windows 8 中,可以在编码期间随时设置此属性。 从下一个输入帧开始应用更改。
在内部,编码器将此属性转换为 AVEncVideoEncodeQP 值。

 

以下属性需要Windows 8。

属性 说明
CODECAPI_AVEncAdaptiveMode 设置自适应编码模式。 H.264 编码器在 Windows 8 中支持以下模式:
  • eAVEncAdaptiveMode_None。 无自适应编码。 (默认。)
  • eAVEncAdaptiveMode_FrameRate。 自适应更改帧速率。

CODECAPI_AVEncCommonBufferSize 设置固定比特率的缓冲区大小(以字节为单位), (CBR) 编码。
有效范围是 [1 ...22²–1]。
需要Windows 8。
CODECAPI_AVEncCommonMaxBitRate 对于受约束的 VBR 编码,指定排出“泄漏桶”的速率(以位/秒为单位)。 当速率控制模式 eAVEncCommonRateControlMode_PeakConstrainedVBR时,此属性适用。
有效范围为 [1 ...2²²–1]。
CODECAPI_AVEncCommonMeanBitRate 设置编码的位流的平均比特率(以位/秒为单位)。 如果速率控制模式 eAVEncCommonRateControlMode_Quality,则忽略此属性。
有效范围为 [1 ...2²²–1]。
在 CBR 和无约束 VBR 模式下,平均比特率决定文件的最终大小。 在 CBR 模式下,平均比特率也是从“泄漏桶”中排出压缩位的速率。 (有关详细信息,请参阅 泄漏桶缓冲区模型。)
在 Windows 7 中,平均比特率由媒体类型上的 MF_MT_AVG_BITRATE 属性指定。
在 Windows 8 中,可以使用 MF_MT_AVG_BITRATE 属性或 CODECAPI_AVEncCommonMeanBitRate 属性设置平均比特率。 如果两者都已设置,CODECAPI_AVEncCommonMeanBitRate替代。 在 Windows 8 中,可以在编码期间设置平均比特率。 如果比特率发生更改,编码器将使用自适应编码。
CODECAPI_AVEncCommonQualityVsSpeed 设置质量/速度权衡。 有效范围:
  • 0–33:低复杂性
  • 34–66:中等复杂性 (默认)
  • 67–100:高复杂性

此值影响编码器如何执行各种编码操作,例如运动补偿。 在复杂性级别较高时,编码器运行速度较慢,但以相同的比特率生成更好的质量。
CODECAPI_AVEncH264CABACEnable 启用或禁用 CABAC (适用于 H.264 熵编码的上下文自适应二进制算术编码) 。 默认值为 VARIANT_FALSE
CABAC 不用于基线配置文件。
CODECAPI_AVEncH264SPSID 在 H.264 位流的 SPS NAL 单位中设置 seq_parameter_set_id 的值。
CODECAPI_AVEncMPVDefaultBPictureCount 设置输出位流中连续 B 帧的最大数目。 有效值为:
  • 0:不要使用 B 帧 (默认) 。
  • 1:使用一个 B 帧。
  • 2:使用两个 B 帧。
若要设置此参数,请在调用 IMFTransform::SetOutputType 之前设置 属性。
对于基线配置文件,B 帧数始终为零。 编码器将替代非零值。
对于其他 H.264 配置文件,如果此属性为非零,则编码模式为 IBBPBBP,其中最大连续 B 帧数等于 CODECAPI_AVEncMPVDefaultBPictureCount
CODECAPI_AVEncMPVGOPSize 设置从一个 GOP 标头到下一个 GOP 标头的图片数,包括前导定位点,但不包括以下定位点。
有效范围为 [0 ...2²²–1]。 如果为零,则编码器选择 GOP 大小。 默认值为零。
CODECAPI_AVEncNumWorkerThreads 设置编码器使用的工作线程数。
有效范围为 0-16。 如果为零,则编码器选择线程数。
CODECAPI_AVEncVideoContentType 指示视频内容的类型。
CODECAPI_AVEncVideoEncodeQP 有效范围:16–51。 默认值为 24。
当速率控制模式 eAVEncCommonRateControlMode_Quality时,此属性适用。
此属性配置与 AVEncCommonQuality 相同的编码设置。 但是, AVEncVideoEncodeQP 使应用程序能够直接指定 QP 的值。 如果同时设置了这两个属性,则 AVEncVideoEncodeQP 将替代。
默认值 24 对应于 AVEncCommonQuality 设置的默认值 70。
CODECAPI_AVEncVideoForceKeyFrame 强制编码器将下一帧编码为关键帧。
CODECAPI_AVEncVideoMinQP 有效范围:0–51。 默认值为 0。
此属性适用于所有速率控制模式。 编码器生成的 QP 值不应低于 CODECAPI_AVEncVideoMinQP 属性指定的值。
CODECAPI_AVLowLatencyMode 启用或禁用低延迟模式。 请参阅“备注”部分中的“多线程处理”。

 

备注

编码器支持以下速率控制模式。

模式 返回的常量 说明
固定比特率 (CBR) eAVEncCommonRateControlMode_CBR 编码器尝试使用“泄漏桶”模型实现恒定比特率。 目标比特率由 CODECAPI_AVEncCommonMeanBitRate 属性提供。
需要Windows 8。
受约束的可变比特率 (VBR) eAVEncCommonRateControlMode_PeakConstrainedVBR 编码器使用具有峰值比特率的“泄漏桶”模型。 泄漏桶的排出率由 CODECAPI_AVEncCommonMaxBitRate 属性提供。
需要Windows 8。
基于质量的可变比特率 (VBR) eAVEncCommonRateControlMode_Quality 编码器尝试实现由 AVEncCommonQuality 属性给出的恒定质量级别。
不受约束的 VBR eAVEncCommonRateControlMode_UnconstrainedVBR 编码器尝试实现输出媒体类型中 MF_MT_AVG_BITRATE 属性给定的目标比特率。 这是默认模式。

 

CBR 和约束 VBR 模式需要Windows 8。

在 Windows 8 中,编码器在输出示例中设置以下属性:

注意

以前版本的文档错误地指出 Windows Server 2008 R2 支持编码器。

 

多线程处理

在 Windows 8 中,编码器支持两种编码模式:

  • 切片编码。 在此模式下,切片是并行编码的。 每个切片在不同的线程上编码。 此模式的延迟较低,因为单个图片是并行编码的。 但是,此方法不会随着核心数的增加而缩放,因为切片数受输入图片中宏块行数的限制。
  • 多帧编码。 在此模式下,编码器接受多个输入帧并并行编码。 此模式在多核环境中可更好地缩放,但会引入更多延迟。

编码器默认为切片编码,以最大程度地减少延迟。 若要启用多帧编码,请将 CODECAPI_AVLowLatencyMode 属性设置为 VARIANT_FALSE

若要设置编码器使用的工作线程数,请设置 CODECAPI_AVEncNumWorkerThreads 属性。

在 Windows 7 中,编码器始终使用切片编码。

认证硬件编码器

如果存在经过认证的硬件编码器,则通常将使用该编码器,而不是媒体基础相关方案的收件箱系统编码器。 需要经过认证的编码器才能支持一组特定的 ICodecAPI 属性,并且可以选择性地支持另一组属性。 认证过程应保证正确支持所需的属性,如果支持可选属性,则也得到适当支持。

下面是编码器通过 HCK 编码器认证的必需和可选 ICodecAPI 属性集。

需要以下Windows 8和Windows 8.1 ICodecAPI 属性:

以下Windows 8.1 ICodecAPI 属性是可选的,但如果支持,则会在 HCK 中测试。

以下Windows 8和Windows 8.1 ICodecAPI 属性是可选的,但如果支持,则会在 HCK 中进行测试。

以下 ICodecAPI 属性是可选的。 它们未在 HCK 中进行测试。

要求

要求
最低受支持的客户端
Windows 7 [仅限桌面应用]
最低受支持的服务器
无受支持的版本
DLL
Mfh264enc.dll

另请参阅

编解码器对象

Media Foundation 中的 MPEG-4 支持

Media Foundation 中支持的媒体格式

视频媒体类型