gpt4 book ai didi

wpf - 注册嵌入式 DirectShow 过滤器

转载 作者:行者123 更新时间:2023-12-01 05:12:20 28 4
gpt4 key购买 nike

我目前正在开发一个使用 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"));

它是否正确?我正试图弄清楚下一步该去哪里。我将如何使用它来构建过滤器图?

最佳答案

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

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

您不想注册的过滤器可以通过直接创建 C++ 对象或通过加载 DLL 并使用其 DllGetClassObject 来实例化。导出函数的方式与 COM 通过注册进行实例化的方式相同。

另一个注意事项是,COM 类可以“按用户”注册,无需管理员权限,这样的注册启用标准 CoCreateInstance。实例化(但不是智能连接 - 见下文)。

遇到的典型问题是您希望通过 DirectShow Intelligent Connect 自动添加您感兴趣的过滤器,例如视频/音频解码器。这仅适用于完整的 COM 注册,或者替代选项是我在此省略的 API Hook 。长话短说:如果您没有注册过滤器,则必须通过代码自己实例化并将它们添加到过滤器图中。

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

也可以看看:

  • How can I directly embed a DirectShow Push Source filter in an EXE?
  • C# Register Embedded Directshow Filter
  • Can I make my private DirectShow filter discoverable by Moniker by external programs?
  • 关于wpf - 注册嵌入式 DirectShow 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23698336/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com