我目前正在处理Windows Media Foundation。然而,由于微软H.264解码器的一些问题和一些自定义格式的解码器缺失,我想知道是否有可能直接使用CLSID实例化一个DirectShow解码器,并围绕它构建一个代理,公开IMFTransform以获得媒体基础的解码器。所以我的问题是:
我是否可以直接实例化一个Directshow过滤器(最好是解码器),并使用它们进行解码(例如,放置一些压缩帧和获取未压缩帧)来创建MFT?
我知道如何使用过滤器的CLSID来实例化过滤器本身。但是,我不知道如何使用实际的解码功能。
任何想法,提示,链接,无论什么都将受到感谢。谢谢,
J.
发布于 2010-12-22 02:42:52
(免责声明:我实际上从未这样做过,但我看不出有什么技术原因不能这样做。所以YMMV)
如果解码器是一个DMO过滤器,那么它会容易得多--您可以通过IMediaObject与它通信。这与DirectShow使用DMO的方式没有太大区别;它只是用另一个转换过滤器包装DMO,该过滤器处理媒体类型协商和样本传递,但是没有什么能真正阻止您在自己的应用程序中执行此操作。
有一个问题:对于IMediaObject::ProcessInput和IMediaObject::ProcessOutput,您需要自己的buffer类来实现IMediaBuffer。但它是一个非常基本的接口,所以我认为你在实现它时不会有太多困难。这是一个basic implementation。
对于常规的directshow筛选器,它实际上要困难得多,因为大多数DirectShow筛选器实际上依赖于有可用的外部图(例如:所有的directshow事件在某种程度上都假定了这个图的存在)。如果你真的想使用一个单独的DShow过滤器,你可能必须包装整个过滤器图,然后有一个定制的源过滤器来馈送样本。您可以使用示例抓取器(或自定义呈现过滤器)将示例从图形中拉出并公开给应用程序的其余部分。(一种疯狂的想法甚至是将此图包装在DMO filter实现中,然后使用IMediaObject与其对话--然而,这可能很棘手)
幸运的是,大多数解码器往往被实现为DMO过滤器,所以我认为你很有可能只使用IMediaObject。
发布于 2011-10-16 07:43:35
我不确定你为什么要这么做。你不会真的想要一个生活在图之外的过滤器。
如果您不想使用传统的文件/网络源过滤器或传统的渲染器,您可以编写缓冲区渲染器和缓冲区源过滤器,您可以将指针传递到这些渲染器,并从中获取指针。然后你可以把所有的乱七八糟的东西放到一个图中并运行它,然后几乎不需要任何其他东西就可以直接使用解码器。这并不难做到。解码器可能希望得到PES数据包流。
https://stackoverflow.com/questions/3458868
复制相似问题