Tee/passthrough DirectShow 数据作为视频源
Tee/passthrough DirectShow data as video source
我有一个应用程序可以通过 DirectShow 从图像采集卡获取视频样本。然后应用程序进行一些处理并通过网络发送视频信号。我现在想复制此视频信号,以便另一个支持 DirectShow 的软件(如 Skype)也可以使用原始输入信号。
我知道您可以在 DirectShow 中创建 Tee 过滤器,就像用于分割视频信号以进行录制和预览的过滤器一样。但是,据我了解,此过滤器仅在单个图形中有用,即我不能使用它来将视频从我的进程转发到 Skype 等。
我也知道我可以编写自己的视频源,但这会 运行 在消费应用程序的过程中。问题是我不能把我原来应用程序的逻辑放在这样的视频源过滤器中。
我能想到的唯一解决方案是我的应用程序将帧写入共享内存块,然后视频源过滤器从那里读取它。同步将使用共享的互斥锁来完成。那行得通吗?我特别不喜欢同步部分?
而且更重要的是,有没有更好的方案来解决这个问题?
API 的工作方式与您确定的一样:视频捕获应用程序(例如 Skype)请求视频流时没有考虑进程间通信,不涉及使用另一个进程中生成的输出的 IPC。您在这里的挑战是自己提供此 IPC,以便一个应用程序生成数据,然后另一个应用程序扩展现有 API(虚拟视频源设备)并选择现有数据,然后按生成的形式提供。
对于视频,您有一个相对较大的数据流,您希望避免对其进行过度复制。文件映射(又名共享内存)是正确的做法:将字节放入一个进程,它们在另一个进程中立即可见。您可以使用两个进程协同使用的名称事件和互斥锁来同步对数据的访问 - 以表示新数据缓冲区的可用性,表示已使用的缓冲区不再使用等。
我有一个应用程序可以通过 DirectShow 从图像采集卡获取视频样本。然后应用程序进行一些处理并通过网络发送视频信号。我现在想复制此视频信号,以便另一个支持 DirectShow 的软件(如 Skype)也可以使用原始输入信号。
我知道您可以在 DirectShow 中创建 Tee 过滤器,就像用于分割视频信号以进行录制和预览的过滤器一样。但是,据我了解,此过滤器仅在单个图形中有用,即我不能使用它来将视频从我的进程转发到 Skype 等。
我也知道我可以编写自己的视频源,但这会 运行 在消费应用程序的过程中。问题是我不能把我原来应用程序的逻辑放在这样的视频源过滤器中。
我能想到的唯一解决方案是我的应用程序将帧写入共享内存块,然后视频源过滤器从那里读取它。同步将使用共享的互斥锁来完成。那行得通吗?我特别不喜欢同步部分?
而且更重要的是,有没有更好的方案来解决这个问题?
API 的工作方式与您确定的一样:视频捕获应用程序(例如 Skype)请求视频流时没有考虑进程间通信,不涉及使用另一个进程中生成的输出的 IPC。您在这里的挑战是自己提供此 IPC,以便一个应用程序生成数据,然后另一个应用程序扩展现有 API(虚拟视频源设备)并选择现有数据,然后按生成的形式提供。
对于视频,您有一个相对较大的数据流,您希望避免对其进行过度复制。文件映射(又名共享内存)是正确的做法:将字节放入一个进程,它们在另一个进程中立即可见。您可以使用两个进程协同使用的名称事件和互斥锁来同步对数据的访问 - 以表示新数据缓冲区的可用性,表示已使用的缓冲区不再使用等。