这不是一个简单的练习,但它可以完成。我知道,因为我以前做过。 :)
我在C++中实现了这一点。
你需要做的是创建所谓的共享内存服务器。共享内存服务器是多个进程可以访问的ram区域。以下是如何创建一个使用Windows下的命名共享内存:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v=vs.85).aspx
在您的应用程序,它从两个摄像头混合的视频,你需要创建一个DirectShow渲染过滤器(CBaseRenderer)写入混合视频帧进入这个共享内存。
另一方面,您需要创建一个单独的Visual Studio DLL项目,该项目将实现DirectShow捕获筛选器(CSource和CSourceStream),该筛选器将读取您的主应用程序写入此缓冲区的视频位图。这个VS项目需要是一个可注册的DLL,可以将其注册为Windows的DirectShow捕获设备。
您的主应用程序将在其运行时创建并维护此共享内存缓冲区。如果另一个应用程序(如视频会议程序)访问捕获设备,则来自该设备的所有内容都将为空白缓冲区,直到主应用程序明星将实际视频帧添加到该应用程序为止。提示1:由于这是一个多线程操作,因此您需要一个事件句柄来通知捕获过滤器一个帧已准备就绪。您还需要一个互斥锁来控制应用程序中的“渲染”线程和捕获设备中的“捕获”线程对缓冲区的访问。提示#2:你不需要在内存指针上调用UnmapViewOfFile或CloseHandle,直到渲染或捕获过滤器被处置。
有很多代码需要研究,所以任何有用的例子都不在本次讨论的范围之内。这应该让你朝着正确的方向前进。祝你好运!
我刚刚检查了我的旧代码。它总共花了1500行代码来实现整个事情(渲染过滤器,捕获过滤器和DLL) - 而不是“成千上万”的代码行。 – Escovado