DMO 基础知识 (Microsoft Media Foundation)

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

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

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

一般情况下,编解码器 DTO 压缩和解压缩数字媒体所需的可变信息通过以下三种方式之一传递:

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

此外,某些编解码器功能通过使用特定于编解码器 DSO 的其他接口进行管理。 编解码器 对象部分为每个编解码器列出了这些接口。

输入和输出类型特定于输入和输出流。 每个流都表示内容的离散表示形式。 例如,Windows Media Video 编码器 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 。 某些 DTO 要求在枚举任何输入类型之前设置输出类型。 Windows Media 音频和视频编解码器 DSO 都具有相互依赖的验证的输入和输出。 也就是说,设置的输出类型将设置输入类型的验证条件。 还有一些属性在设置时会更改有效的输入和输出类型。 因此,在枚举类型之前,应在 DMO 上设置所有所需的属性。

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

使用编解码器 DME