0

我需要从同一台计算机上的 2 个网络摄像头获取流媒体,并将其混合为假网络摄像头(这样我就可以在任何软件上使用假网络摄像头)。我已经看到 camcamx 适用于 mac,webcamstudio 适用于 linux,但我需要一个适用于 windows 的解决方案,但我找不到它,所以我想编写自己的小应用程序。我可以使用 C#、Java 和 lazarus 进行编程,但示例或库或任何语言的任何内容都会有所帮助。

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

任何人都可以帮助我吗?

4

3 回答 3

2

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

我在 C++ 中实现了这个。

您需要做的是创建所谓的共享内存服务器。共享内存服务器是一个内存区域,多个进程可以访问。以下是如何在 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。

您需要编写大量代码,因此任何有用的示例都超出了本次讨论的范围。这应该让你朝着正确的方向前进。祝你好运!

于 2011-09-27T02:58:35.483 回答
0

我认为您的问题超出了该网站的全部范围。如果您要自己编写此软件,您正在谈论成千上万行代码以及驱动程序、视频解码、混合等方面的深入了解。

话虽如此,可能适用于 Windows 的软件。我将从这里开始:

于 2011-09-24T22:32:44.250 回答
0

从真实网络摄像头捕获视频:MSDN 上的视频捕获

假网络摄像头:众所周知的起点是 Vivek 的示例/项目,可在http://tmhare.mvps.org/downloads.htm获得,另请参阅这篇文章“假” DirectShow 视频捕获设备

齐心协力是可行的,尽管并非微不足道。

于 2011-09-25T07:11:08.397 回答