DMO 体系结构

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

本部分介绍 DMO 的整体体系结构。

DMO 是一个对象,它接受 m 输入并生成 n 个输出。 输入和输出称为 。 每个 DMO 至少有一个流。 流不是对象;它们只是按索引号在 DMO 上引用。 流数在设计时固定。

媒体类型

所有数据都使用 媒体类型进行类型化,该类型定义如何解释数据的内容。 例如,320 x 240 24 位 RGB 视频是一种类型;44.1 千赫 (kHz) 16 位立体声 PCM 音频是另一种类型。 媒体类型是使用DMO_MEDIA_TYPE结构描述 。 在客户端可以处理任何数据之前,它必须设置 DMO 上每个流的媒体类型。

通常,流可以接受一系列媒体类型。 某些 DMC 支持比其他类型更广泛的类型。 DMO 接口定义客户端发现支持类型的方法。 例如,一个 DMO 可能支持任何位深度的 RGB 视频,而另一个可能仅支持 24 位 RGB。 此外,DMO 可能仅限于某些输入和输出组合。 例如,如果输入类型是 16 位视频,则输出流可能需要相同的位深度。 客户端可以枚举每个流的首选类型,然后测试特定的组合。

缓冲区

在默认 DMO 模型中,客户端分配单独的输入缓冲区和输出缓冲区。 它用数据填充输入缓冲区并将其传送到 DMO,DMO 会将新数据写入输出缓冲区。

(可选)DMO 可以支持“就地”处理。 通过就地处理,DMO 将输出直接写入输入缓冲区,超过原始数据。 就地处理无需单独的缓冲区。 另一方面,它会更改原始数据,而某些应用程序可能无法接受原始数据。

IMediaObject 接口支持默认 (非就地) 缓冲模型。 所有 D莫都必须实现此接口。 如果 DMO 支持就地处理,它还公开 IMediaObjectInPlace 接口。 客户端负责分配所有缓冲区,包括输入和输出。

关于 DME