我正在用C ++编写一个OpenCV,它使用OpenCV捕获来自多个视频设备的帧,对它们执行一系列转换,然后生成一个要显示的新帧(以IplImage的形式)。这一切都很完美。
然后我想创建一个捕获源过滤器的实例并将它们发送给这些帧,以创建一个可用于Skype等程序的虚拟视频设备。这是我遇到麻烦的地方。
我已经看过Vivek的Vcam示例(来自here的捕获源过滤器),这似乎是完美的,但我正在努力弄清楚如何修改它以在我的应用程序中使用:< / p>
Vcam用随机值填充缓冲区,而我想用我的框架中的数据填充它。
Vcam生成一个需要在创建过滤器之前注册的DLL文件,但我想在我的应用程序启动时创建过滤器,然后在结束时将其删除
我对DirectShow完全不熟悉,并且只使用C ++进行了几个月的编程,所以我对此表示满意。有人可以概述我为实现上述两项变更而需要采取的步骤吗?
谢谢, 菲尔
答案 0 :(得分:1)
对于具体答案,您的问题有些广泛。
Vcam用随机值填充缓冲区,而我想用我的帧中的数据填充它。
视频源宣传某些视频格式,然后在连接到其他内容时同意其中一种视频格式,然后有效载荷数据需要具有此约定格式。你需要在这里处理所有的步骤。据推测,您的处理使用某种固定格式,或者您可以在开发的初始阶段将其锁定。然后,过滤器需要在其输出引脚上通告它,并拒绝尝试连接任何其他格式。然后将数据复制到缓冲区中,并且当格式匹配时,连接方将接收与连接媒体类型匹配的数据。
Vcam生成一个需要在创建过滤器之前注册的DLL文件,但我想在我的应用程序启动时创建过滤器,然后在它结束时将其删除
这不是它应该如何工作。我假设您需要这个过滤器,因为您想要与另一个寻找可用“相机”,视频源的软件集成。而你想要自己提供这样的服务。这种技巧要求您注册您的相机,然后您可能会处理进程间通信,因为源将由另一个进程托管,您将以某种方式传递您的数据。
这基本上要求您将源完全注册为独立设备,具有从您的应用程序接受数据的功能,并使用标准API进一步流式传输,并在内部了解进程间通信。当然,当您的应用程序终止时,您可以将其取消(取消注册)。我想你低估了你必须要处理的数据流。