In-Place处理

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

某些数据转换可以通过直接修改数据来完成。 这称为 就地 处理。 许多音频和视频效果都可以通过这种方式完成。 如果 DMO 支持就地处理,它将公开 IMediaObjectInPlace 接口。 就地处理通常比对输出使用单独的缓冲区更高效。 (一个主要例外是缓冲区驻留在视频内存中。在这种情况下,读取操作比写入操作慢得多,因此不建议就地处理。)

若要就地处理数据,客户端对 IMediaObjectInPlace::P rocess 方法进行单个调用,而不是单独调用 ProcessInputProcessOutputProcess 方法是同步的;所有处理都在调用内进行。 此外,就地处理不使用 IMediaBuffer 对象。 Process 方法使用直接指向内存缓冲区的指针。

支持就地处理的 DMO 仍必须实现 IMediaObject 接口,包括 ProcessInputProcessOutput 方法。 客户端可以选择是使用就地处理还是使用单独的缓冲区。 但是,不要混合这两种类型的处理。 如果调用 Process,请不要调用 ProcessInputProcessOutput,反之亦然。

效果尾部

就地 DMO 可能会在输入停止后创建一些附加输出。 这称为 效果尾部。 例如,在输入达到静音后,混响效果会继续。 如果存在效果尾部, 则 Process 方法返回S_FALSE。 应用程序处理完其所有数据后,可以通过将空缓冲区发送到 Process 方法来生成效果尾部。

直接托管 DMO