编码器上的媒体类型协商
在 Microsoft Media Foundation 中,编码器实现为 媒体基础转换 (MRT,) 一个输入和一个输出。 在编码会话之前,编码器需要知道它将作为输入接收的流的特征,以及它将作为输出生成的流的格式。 在通过编码器传递数据之前,必须设置输入和输出媒体类型和相关特征。 必须通过指定适当的 媒体类型 GUID 来提供输入和输出格式,并通过在输出媒体类型上设置相关的 媒体类型属性 来设置输出流的特征。 新实例化的编码器没有任何设置的媒体类型。
输入媒体类型是未压缩的格式,如 PCM 音频或 RGB 视频。 编码器使用的格式类型仅限于 VIDEOINFOHEADER 和 WAVEFORMATEX 结构描述的格式类型。 有关这些结构的详细信息,请参阅 Windows SDK 文档。媒体基础提供帮助程序函数,用于从格式结构创建媒体类型。 例如,MFInitMediaTypeFromVideoInfoHeader 函数从 VIDEOINFOHEADER 结构初始化视频类型,MFInitMediaTypeFromWaveFormatEx 函数从 WAVEFORMATEX 或 WAVEFORMATEXTENSIBLE 结构初始化视频类型。 有关详细信息,请参阅 媒体类型转换。 必须通过调用 IMFTransform::SetInputType 在编码器上设置输入媒体类型。
输出媒体类型是最终源流或文件中使用的压缩格式。 只能在设置输入媒体类型后设置可用的输出媒体类型。 可以通过在循环中调用 IMFTransform::GetOutputAvailableType 来检索支持的输出类型,直到编码器返回 MF_E_NO_MORE_TYPES。 每次迭代时递增类型索引。 找到适当的媒体类型时,通过调用 IMFTransform::SetOutputType 设置输出媒体类型。
选择输出媒体类型的决定因素取决于编码类型和编码要求。 例如,对于 CBR 编码的音频流,需要查找与输入匹配且比特率尽可能接近目标值的媒体类型。
如果要使用 CBR 以外的编码模式,则必须设置 模式,然后枚举该模式的输出类型,因为编码器会根据模式集更改支持的输出类型。 控制编码模式的属性 MFPKEY_VBRENABLED 和 MFPKEY_PASSESUSED。 例如,如果要枚举 VBR 质量编码的输出类型,则媒体类型取决于你决定使用的质量值。 有关设置这些属性的信息,请参阅 编码属性。
相关主题