Microsoft Media Foundation) (DMO 基础知识

本主题简要概述了与Windows媒体编解码器相关的 DMO。 有关 DMO 的详细信息,请参阅 DirectX 媒体对象

DMO是转换数据的 COM 对象。 将数据传递给它,并返回转换后的数据。 对于编解码器编码器DMO,输入未压缩的媒体数据,DMO提供压缩媒体数据。 使用 DMO 的主要优点是,它们都实现相同的基接口 IMediaObject,这简化了使用它们,因为无论要执行的转换类型如何,都可以使用相同的对象。

由于任何类型的数据转换中都涉及变量,因此音频和视频转换必须考虑到各种可能的媒体配置。 Windows媒体音频和视频编解码器还支持多种特殊功能,必须使用DMO进行配置。

一般情况下,编解码器 DMO 压缩和解压缩数字媒体所需的变量信息采用以下三种方式之一进行传达:

  • 设置DMO上的输入类型,以传达传递给编码器DMO的未压缩媒体的特征,以及传递到解码器DMO的压缩介质的特征。
  • 设置DMO上的输出类型,以传达编码器DMO传递的压缩介质的特征,以及解码器DMO传递的未压缩媒体的特征。
  • 使用 IPropertyBag 接口的方法,将支持编解码器 DMO 的各种功能的其他设置配置为属性。 IPropertyBag 是所有编解码器 DMO 支持的标准 COM 接口。

此外,某些编解码器功能通过使用特定于编解码器 DMO 的其他接口进行管理。 这些接口针对 Codec Objects 节中的每个编解码器列出。

输入和输出类型特定于输入和输出流。 每个流表示内容的离散表示形式。 例如,Windows媒体视频编码器DMO有一个输入流和两个输出流。 输入流接受未压缩的视频示例。 这两个输出流的第一个输出流提供压缩样本;另一个提供未压缩的示例。 一个输出流中的单个样本表示与其他流中相应样本相同的内容,但每个流以不同的格式提供这些样本。

每个流 (输入或输出) 都支持一种或多种媒体类型。 媒体类型或格式由 DMO_MEDIA_TYPE 结构描述。 可以通过调用 IMediaObject::GetOutputType 查询输出流支持的类型DMO。 此方法返回有效的 (,但在某些情况下,该流的输出类型部分不完整) 。 可以通过对 GetOutputType 进行重复调用来枚举输出流的受支持媒体类型,并使用每个调用递增类型参数。 当传递的类型索引超出边界时,该方法将返回 DMO_E_NO_MORE_ITEMS。 可以使用 IMediaObject::GetInputType 方法以相同的方式枚举输入格式。

DMO枚举的类型只是“首选”类型,但可能支持其他类型的类型。 可以通过调用 IMediaObject::SetOutputType 来验证输出类型。 使用 IMediaObject::SetInputType 验证输入类型。 如果传递的DMO_MEDIA_TYPE结构无效,这两种方法都将返回DMO_E_TYPE_NOT_ACCEPTED。 某些 DMO 要求在枚举任何输入类型之前设置输出类型。 Windows媒体音频和视频编解码器 DMO 都具有具有相互依赖验证的输入和输出。 也就是说,你设置的输出类型将为输入类型设置验证条件。 还有一些属性,在设置时,更改有效的输入和输出类型。 因此,在枚举类型之前,应在DMO上设置所有所需属性。

设置DMO的输出和输入类型后,可以开始处理示例。 每个输入示例都使用对 IMediaObject::P rocessInput 的调用传递给编解码器,在调用 IMediaObject::P rocessOutput 时,每个输出示例由编解码器提供。

使用编解码器 DMO