如何在 C++ 应用程序中使用自定义捕获源过滤器?

Posted

技术标签:

【中文标题】如何在 C++ 应用程序中使用自定义捕获源过滤器?【英文标题】:How to use a custom capture source filter in a C++ application? 【发布时间】:2014-02-14 20:33:52 【问题描述】:

我正在用 C++ 编写一个 OpenCV,它使用 OpenCV 从多个视频设备捕获帧,对它们执行一系列转换,然后生成一个新帧来显示(以 IplImage 的形式)。这一切都很完美。

然后我想创建一个捕获源过滤器的实例并将这些帧发送给它,以创建一个可与 Skype 等程序一起使用的虚拟视频设备。这就是我遇到麻烦的地方。

我查看了 Vivek 的 Vcam 示例(从 here 捕获源过滤器),这似乎很完美,但我正在努力弄清楚如何修改它以在我的应用程序中使用:

    Vcam 用随机值填充缓冲区,而我想用帧中的数据填充它。

    Vcam生成一个DLL文件,需要在创建过滤器之前注册,但是我想在我的应用程序启动时创建过滤器,然后在它结束时删除它

我对 DirectShow 完全陌生,并且只使用 C++ 编程了几个月,所以我对此一头雾水。有人可以概述一下我需要采取哪些步骤来实施上述两项更改吗?

谢谢, 菲尔

【问题讨论】:

【参考方案1】:

对于具体的答案,您的问题有些宽泛。

Vcam 用随机值填充缓冲区,而我想用帧中的数据填充它。

视频源宣传某些视频格式,然后在连接到其他内容时同意其中一种格式,然后有效负载数据需要采用这种约定格式。您需要处理这里的所有步骤。据推测,您的处理使用某些固定格式,或者您可以在开发的初始步骤将其锁定。然后过滤器需要在其输出引脚上宣传它并拒绝与任何其他格式连接的尝试。然后将数据复制到缓冲区中,当格式匹配时,连接方会收到与连接媒体类型匹配的数据。

Vcam产生一个DLL文件,需要在创建过滤器之前注册,但是我想在我的应用程序启动时创建过滤器,然后在它结束时删除它

这不是它应该如何工作的。我假设您需要此过滤器,因为您想与另一个寻找可用“相机”视频源的软件集成。你想让你自己的可用。这种技巧需要您注册您的相机,然后您可能会负责进程间通信,因为源将由另一个进程托管,并且您将以某种方式将数据传递到那里。

这基本上要求您将源完全注册为独立设备,该设备具有接受来自您的应用程序的数据的能力,并使用标准 API 进一步流式传输,并在内部了解进程间通信。当然,当您的应用程序终止时,您可以将其取消(取消注册)。我想您低估了您必须处理的数据流。

【讨论】:

以上是关于如何在 C++ 应用程序中使用自定义捕获源过滤器?的主要内容,如果未能解决你的问题,请参考以下文章

如何从WDM流音频源(Realtek HD Audio)捕获

如何在子窗口小部件下使用 eventfilter 来捕获自定义事件

如何调试并进入转换为 C++ 的自定义语言源?

在捕获设备源过滤器中捕获另一个相机?

如何在内容页面中添加按钮以使用自定义渲染器 - 视图捕获图像

如何在自定义 Sub 中获取 VBA Access 中文本框的更新值?