2011-09-24 179 views
0

我需要从同一台计算机上的2个摄像头获取流媒体,并将其作为假摄像头混合(然后我可以在任何软件上使用假摄像头)。 我已经看到camcamx适用于mac,webcamstudio适用于linux,但我需要windows解决方案,而且我无法找到它,所以我正在考虑编写自己的小应用程序。 我可以用C#,Java和lazarus编程,但是任何语言的示例或库或任何其他语言都将有所帮助。将2个真实摄像头混合到假摄像头

我需要制作一个假摄像头,可以用作网络摄像头(在我的计算机上检测为usb网络摄像头),以及一些代码来抓取来自两个真实摄像头的流,并将所有内容混合在一起(会有像一个主要的网络摄像头,将会更大,次要网络摄像头会更小,在大图像的角落)

任何人都可以帮助我吗?

回答

0

我认为你的问题远远超出了本网站的全部内容。如果你打算自己编写这个软件,那么你正在谈论成千上万的代码行和对驱动程序,视频解码,混音等的深入了解。

这样说,有可能软件为此用于Windows。从实际摄像头

2

这不是一个简单的练习,但它可以完成。我知道,因为我以前做过。 :)

我在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,直到渲染或捕获过滤器被处置。

有很多代码需要研究,所以任何有用的例子都不在本次讨论的范围之内。这应该让你朝着正确的方向前进。祝你好运!

+0

我刚刚检查了我的旧代码。它总共花了1500行代码来实现整个事情(渲染过滤器,捕获过滤器和DLL) - 而不是“成千上万”的代码行。 – Escovado