(免责声明:我实际上从未这样做过,但我认为没有技术原因无法做到。所以 YMMV)
如果解码器是 DMO 过滤器,那么它会容易得多——您可以通过IMediaObject与它对话。这与 DirectShow 使用 DMO 的方式并没有太大区别。它只是用另一个处理媒体类型协商和样本传递的转换过滤器包装 DMO,但没有什么能真正阻止您在自己的应用程序中执行此操作。
有一个问题:对于 IMediaObject::ProcessInput 和 IMediaObject::ProcessOutput,您需要自己的缓冲区类来实现IMediaBuffer。但这是一个非常基本的界面,所以我认为你在实现它时不会遇到太多麻烦。这是一个基本的实现。
对于常规的 directshow 过滤器,实际上要困难得多,因为大多数 DirectShow 过滤器确实依赖于可用的外部图(例如:所有的 directshow 事件类型都假定该图的存在)。如果您真的想单独使用单个 DShow 过滤器,您可能必须包装整个过滤器图,然后使用自定义源过滤器来提供样本。您可以使用样本采集器(或自定义渲染过滤器)来将样本从图中拉出并暴露给应用程序的其余部分。(一种疯狂的想法甚至是将这个图包装在 DMO 过滤器实现中,然后使用 IMediaObject 与之对话——但这可能很棘手)
幸运的是,大多数解码器都倾向于作为 DMO 过滤器实现,所以我认为您很有可能只使用 IMediaObject。