在DirectShow之外使用DirectShow过滤器?

时间:2010-08-11 13:38:26

标签: directshow instantiation ms-media-foundation decoder clsid

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

我可以直接实例化Directshow过滤器(首选解码器)并使用它们进行解码(即放置一些压缩帧并获得未压缩的帧)来创建MFT吗?

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

任何想法,提示,链接任何将被欣赏。谢谢,

学家

2 个答案:

答案 0 :(得分:5)

(免责声明:我从未真正做到这一点,但我认为没有技术上的理由无法完成。所以YMMV)

如果解码器是DMO过滤器,那么它将变得更加容易 - 您可以通过IMediaObject与之对话。这与DirectShow使用DMO的方式并没有太大的不同;它只是用另一个处理媒体类型协商和样本传递的转换过滤器包装DMO,但没有什么能阻止你在自己的应用程序中这样做。

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

对于常规的directshow过滤器,它实际上会变得更加困难,因为大多数DirectShow过滤器实际上都依赖于可用的外部图形(例如:所有directshow事件都假设存在此图形) 。如果你真的想单独使用一个DShow过滤器,你可能需要包装整个过滤器图形,然后有一个自定义源过滤器来输入样本。你可以使用样本采集器(或自定义渲染过滤器)来从图表中抽出样本并暴露给应用程序的其余部分。 (一种疯狂的想法甚至是将这个图形包装在DMO过滤器实现中,然后使用IMediaObject与之交谈 - 但这可能很棘手)

幸运的是,大多数解码器往往被实现为DMO过滤器,所以我认为你很有可能只使用IMediaObject。

答案 1 :(得分:2)

我不确定你为什么要这样做。你真的不希望过滤器生活在图表之外。

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