我需要在同一台计算机上从2个网络摄像头获取流媒体,并将其混合为假网络摄像头(这样我就可以在任何软件上使用假网络摄像头)。 我已经看到camcamx用于mac,webcamstudio用于linux,但我需要一个Windows解决方案,我找不到它,所以我想写我自己的小应用程序。 我可以使用C#,Java和lazarus编程,但是示例或库或任何语言的任何东西都会有所帮助。
我需要制作一个可以用作网络摄像头的假网络摄像头(在我的计算机上作为USB网络摄像头检测到),还有一些代码可以从两个真正的网络摄像头中抓取流并将所有内容混合在一起(将会像主要网络摄像头将更大,一个次要网络摄像头将更小,在大图像的一角)
任何人都可以帮助我吗?
答案 0 :(得分: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。
您需要研究很多代码,因此任何有用的示例都超出了本讨论的范围。这应该让你朝着正确的方向前进。祝你好运!
答案 1 :(得分:0)
我认为你的问题远远超出了这个网站的范围。如果您打算自己编写这个软件,那么您正在谈论成千上万行代码以及对驱动程序,视频解码,混合等等的深入了解。
据说,对于Windows,可能是软件。我从这里开始:
答案 2 :(得分:0)
从真实网络摄像头捕获视频:Video Capture on MSDN
虚假网络摄像头:众所周知的起点是Vivek在http://tmhare.mvps.org/downloads.htm提供的示例/项目,另请参阅此帖"Fake" DirectShow video capture device
尽管不是一件容易的事情,但总是尽力而为。