注册Embedded DirectShow过滤器

时间:2014-05-16 14:51:04

标签: wpf com directshow mediaelement regsvr32

我正在使用DirectShow过滤器播放视频。该应用程序是用WPF编写的,并使用MediaElements播放视频。只要注册DirectShow过滤器,视频就会播放。目前我只是使用regsvr32在播放前注册过滤器。

我想知道的是,在运行应用程序时是否可以从嵌入式资源加载过滤器?我试图避免需要管理员权限来注册过滤器。

编辑:

好的我正在尝试使用这些信息并提出解决方案。您将不得不原谅我在DirectShow领域缺乏知识。我没有编写过滤器,我只是想用它来提出一个解决方案。我正在尝试做更多的研究,所以我对DirectShow及其组件的理解要好一些。

我找到了一个方便的ComHelper类,我用它来加载过滤器。

https://gist.github.com/jjeffery/1568627

我正在使用以下代码创建过滤器的实例。

LibraryModule module = LibraryModule.LoadModule(@"filter.ax");
var comObject = ComHelper.CreateInstance(module, new Guid("c91aa7be-f627-46e3-b79f-2de55da46a8b"));

这是对的吗?我想弄清楚接下来要去哪里。我如何使用它来构建过滤器图形?

1 个答案:

答案 0 :(得分:1)

使用未注册的过滤器构建过滤器图表是可能的,但您必须了解障碍,然后决定是否可接受。

DirectShow过滤器是具有宽松线程要求的COM对象。也就是说,向图表添加过滤器不需要完整的COM注册。图形的IGraphBuilder::AddFilter将接受过滤器的界面指针,而不会询问您是如何获得它的。这尤其意味着如果您负责过滤器实例化,然后手动构建图形添加过滤器和连接引脚 - 这肯定会很好。

您不希望注册的过滤器可以通过直接创建C ++对象,或者通过加载DLL并使用其DllGetClassObject导出函数来实例化,就像COM通过注册实例化一样。

另一个注意事项是,COM类可以“按用户”注册,而无需具有管理员权限,并且此类注册启用标准CoCreateInstance实例化(但不支持智能连接 - 请参见下文)。

当您期望通过DirectShow Intelligent Connect自动添加您感兴趣的过滤器(例如视频/音频解码器)时,典型的问题就出现了。这仅适用于完整的COM注册,或备用选项是API挂钩,我在这里省略。简而言之:如果你没有注册过滤器,你必须通过代码自己实例化并将它们添加到过滤器图形中。

关于嵌入的最后说明。过滤器仍将由DLL托管,因此您必须将可执行代码加载到内存中。这意味着您无法直接从“资源”加载它。虽然有一些方法可以在内存中构建可执行的DLL映像,但最简单的方法是保留过滤器DLL并使用LoadLibrary从外部文件加载为常规DLL。如果您希望使用单个二进制文件,则可以将DLL作为二进制资源嵌入,然后在运行时提取到临时文件中,然后从那里继续LoadLibrary

另见: