通过DirectShow数据作为视频源

时间:2015-09-16 18:20:06

标签: c++ winapi video directshow

我有一个应用程序通过DirectShow从帧抓取卡中获取视频样本。然后,应用程序进行一些处理并通过网络发送视频信号。我现在想要复制这个视频信号,这样另一个支持DirectShow的软件(如Skype)也可以使用原始输入信号。

我知道您可以在DirectShow中创建Tee滤镜,就像用于分割视频信号进行录制和预览的滤镜一样。但是,据我所知,此过滤器仅在单个图表中有用,即我无法使用它将视频从我的过程转发到Skype。

我也知道我可以编写自己的视频源,但这会在使用应用程序的过程中运行。问题是我无法将原始应用程序的逻辑放在这样的视频源过滤器中。

我能想到的唯一解决方案是我的应用程序将帧写入共享内存块和从那里读取它的视频源过滤器。可以使用共享互斥锁来完成同步。这可行吗?我特意不喜欢同步部分?

更重要的是,有没有更好的解决方案来解决这个问题?

1 个答案:

答案 0 :(得分:1)

API的工作方式如下所示:视频捕获应用程序(如Skype)在请求视频流时没有考虑进程间通信,没有涉及使用IPC来消耗在另一个进程中生成的输出。您在此面临的挑战是自己提供此IPC,以便一个应用程序生成数据,然后另一个应用程序扩展现有API(虚拟视频源设备)并选择现有数据,然后按生成交付。

对于视频,您拥有相对较大的数据流,并且您有兴趣避免过度复制。文件映射(AKA共享内存)是正确的做法:将字节放在一个进程中,它们立即在另一个进程中可见。您可以使用两个进程协同使用的名称事件和互斥锁来同步对数据的访问 - 指示新缓冲数据的可用性,表示已使用的缓冲区已不再使用等。