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 编码配置文件。 支持的值包括:
|
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 中支持以下模式:
|
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 | 设置质量/速度权衡。 有效范围:
此值影响编码器如何执行各种编码操作,例如运动补偿。 在复杂性级别较高时,编码器运行速度较慢,但以相同的比特率生成更好的质量。 |
CODECAPI_AVEncH264CABACEnable | 启用或禁用 CABAC (适用于 H.264 熵编码的上下文自适应二进制算术编码) 。 默认值为 VARIANT_FALSE。 CABAC 不用于基线配置文件。 |
CODECAPI_AVEncH264SPSID | 在 H.264 位流的 SPS NAL 单位中设置 seq_parameter_set_id 的值。 |
CODECAPI_AVEncMPVDefaultBPictureCount | 设置输出位流中连续 B 帧的最大数目。 有效值为:
对于基线配置文件,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 中,编码器在输出示例中设置以下属性:
- MFSampleExtension_DecodeTimestamp
- MFSampleExtension_VideoEncodePictureType
- MFSampleExtension_VideoEncodeQP
注意
以前版本的文档错误地指出 Windows Server 2008 R2 支持编码器。
多线程处理
在 Windows 8 中,编码器支持两种编码模式:
- 切片编码。 在此模式下,切片是并行编码的。 每个切片在不同的线程上编码。 此模式的延迟较低,因为单个图片是并行编码的。 但是,此方法不会随着核心数的增加而缩放,因为切片数受输入图片中宏块行数的限制。
- 多帧编码。 在此模式下,编码器接受多个输入帧并并行编码。 此模式在多核环境中可更好地缩放,但会引入更多延迟。
编码器默认为切片编码,以最大程度地减少延迟。 若要启用多帧编码,请将 CODECAPI_AVLowLatencyMode 属性设置为 VARIANT_FALSE。
若要设置编码器使用的工作线程数,请设置 CODECAPI_AVEncNumWorkerThreads 属性。
在 Windows 7 中,编码器始终使用切片编码。
认证硬件编码器
如果存在经过认证的硬件编码器,则通常将使用该编码器,而不是媒体基础相关方案的收件箱系统编码器。 需要经过认证的编码器才能支持一组特定的 ICodecAPI 属性,并且可以选择性地支持另一组属性。 认证过程应保证正确支持所需的属性,如果支持可选属性,则也得到适当支持。
下面是编码器通过 HCK 编码器认证的必需和可选 ICodecAPI 属性集。
需要以下Windows 8和Windows 8.1 ICodecAPI 属性:
- CODECAPI_AVEncCommonRateControlMode
- CODECAPI_AVEncCommonQuality
- CODECAPI_AVEncCommonQualityVsSpeed
- CODECAPI_AVEncCommonMeanBitRate
- CODECAPI_AVEncCommonMaxBitRate
- CODECAPI_AVEncCommonBufferSize
- CODECAPI_AVEncMPVGOPSize
- CODECAPI_AVEncVideoEncodeQP
- CODECAPI_AVEncVideoForceKeyFrame
以下Windows 8.1 ICodecAPI 属性是可选的,但如果支持,则会在 HCK 中测试。
- CODECAPI_AVEncVideoMinQP
- CODECAPI_AVEncVideoLTRBufferControl
- CODECAPI_AVEncVideoMarkLTRFrame
- CODECAPI_AVEncVideoUseLTRFrame
- CODECAPI_AVEncVideoEncodeFrameTypeQP
- CODECAPI_AVEncSliceControlMode
- CODECAPI_AVEncSliceControlSize
- CODECAPI_AVEncVideoMaxNumRefFrame
- CODECAPI_AVEncVideoMeanAbsoluteDifference
- CODECAPI_AVEncVideoMaxQP
- CODECAPI_AVEncVideoROIEnabled
- CODECAPI_AVEncVideoTemporalLayerCount (动态)
- CODECAPI_AVEncH264CABACEnable
以下Windows 8和Windows 8.1 ICodecAPI 属性是可选的,但如果支持,则会在 HCK 中进行测试。
以下 ICodecAPI 属性是可选的。 它们未在 HCK 中进行测试。
要求
要求 | 值 |
---|---|
最低受支持的客户端 |
Windows 7 [仅限桌面应用] |
最低受支持的服务器 |
无受支持的版本 |
DLL |
|
另请参阅