2

我目前正在与 Windows Media Foundation 打交道。但是,由于 Microsoft H.264 解码器的一些问题和一些缺少自定义格式的解码器,我想知道是否可以直接使用 CLSID 实例化 DirectShow 解码器,并围绕它构建一个暴露 IMFTransform 的代理为媒体基金会获取解码器。所以这是我的问题:

我可以直接实例化 Directshow 过滤器(最好是解码器)并将它们用于解码(即放置一些压缩帧并获得未压缩的帧)以创建 MFT?

我知道如何使用其 CLSID 实例化过滤器本身。但是,我不知道如何使用实际的解码功能。

任何想法,提示,链接都将不胜感激。谢谢,

J。

4

2 回答 2

5

(免责声明:我实际上从未这样做过,但我认为没有技术原因无法做到。所以 YMMV)

如果解码器是 DMO 过滤器,那么它会容易得多——您可以通过IMediaObject与它对话。这与 DirectShow 使用 DMO 的方式并没有太大区别。它只是用另一个处理媒体类型协商和样本传递的转换过滤器包装 DMO,但没有什么能真正阻止您在自己的应用程序中执行此操作。

有一个问题:对于 IMediaObject::ProcessInput 和 IMediaObject::ProcessOutput,您需要自己的缓冲区类来实现IMediaBuffer。但这是一个非常基本的界面,所以我认为你在实现它时不会遇到太多麻烦。这是一个基本的实现

对于常规的 directshow 过滤器,实际上要困难得多,因为大多数 DirectShow 过滤器确实依赖于可用的外部图(例如:所有的 directshow 事件类型都假定该图的存在)。如果您真的想单独使用单个 DShow 过滤器,您可能必须包装整个过滤器图,然后使用自定义源过滤器来提供样本。您可以使用样本采集器(或自定义渲染过滤器)来将样本从图中拉出并暴露给应用程序的其余部分。(一种疯狂的想法甚至是将这个图包装在 DMO 过滤器实现中,然后使用 IMediaObject 与之对话——但这可能很棘手)

幸运的是,大多数解码器都倾向于作为 DMO 过滤器实现,所以我认为您很有可能只使用 IMediaObject。

于 2010-12-21T18:42:52.210 回答
2

我不确定你为什么要这样做。你真的不想要一个住在图表之外的过滤器。

如果您不想使用传统的文件/网络源过滤器或传统的渲染器,您可以编写缓冲区渲染器和缓冲区源过滤器,将指针传递给并从中获取指针。然后,您可以将整个混乱放入图表并运行它,并且几乎可以直接使用解码器而无需其他任何东西。这不难做到。不过,解码器可能期待 PES 数据包流。

于 2011-10-15T23:43:35.307 回答