编码器上的媒体类型协商

在 Microsoft Media Foundation 中,编码器实现为 媒体基础转换 (MRT,) 一个输入和一个输出。 在编码会话之前,编码器需要知道它将作为输入接收的流的特征,以及它将作为输出生成的流的格式。 在通过编码器传递数据之前,必须设置输入和输出媒体类型和相关特征。 必须通过指定适当的 媒体类型 GUID 来提供输入和输出格式,并通过在输出媒体类型上设置相关的 媒体类型属性 来设置输出流的特征。 新实例化的编码器没有任何设置的媒体类型。

输入媒体类型是未压缩的格式,如 PCM 音频或 RGB 视频。 编码器使用的格式类型仅限于 VIDEOINFOHEADERWAVEFORMATEX 结构描述的格式类型。 有关这些结构的详细信息,请参阅 Windows SDK 文档。媒体基础提供帮助程序函数,用于从格式结构创建媒体类型。 例如,MFInitMediaTypeFromVideoInfoHeader 函数从 VIDEOINFOHEADER 结构初始化视频类型,MFInitMediaTypeFromWaveFormatEx 函数从 WAVEFORMATEX 或 WAVEFORMATEXTENSIBLE 结构初始化视频类型。 有关详细信息,请参阅 媒体类型转换。 必须通过调用 IMFTransform::SetInputType 在编码器上设置输入媒体类型。

输出媒体类型是最终源流或文件中使用的压缩格式。 只能在设置输入媒体类型后设置可用的输出媒体类型。 可以通过在循环中调用 IMFTransform::GetOutputAvailableType 来检索支持的输出类型,直到编码器返回 MF_E_NO_MORE_TYPES。 每次迭代时递增类型索引。 找到适当的媒体类型时,通过调用 IMFTransform::SetOutputType 设置输出媒体类型。

选择输出媒体类型的决定因素取决于编码类型和编码要求。 例如,对于 CBR 编码的音频流,需要查找与输入匹配且比特率尽可能接近目标值的媒体类型。

如果要使用 CBR 以外的编码模式,则必须设置 模式,然后枚举该模式的输出类型,因为编码器会根据模式集更改支持的输出类型。 控制编码模式的属性 MFPKEY_VBRENABLEDMFPKEY_PASSESUSED。 例如,如果要枚举 VBR 质量编码的输出类型,则媒体类型取决于你决定使用的质量值。 有关设置这些属性的信息,请参阅 编码属性

实例化编码器 MFT

Windows Media 编码器