【问题标题】:mix 2 real webcam into a fake webcam将 2 个真实的网络摄像头混合成一个假的网络摄像头
【发布时间】:2011-09-24 22:25:28
【问题描述】:

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

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

有人可以帮我吗?

【问题讨论】:

    标签: windows video video-streaming webcam mixer


    【解决方案1】:

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

    我用 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。

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

    【讨论】:

    • 我刚刚检查了我的旧代码。总共花了 1500 行代码来实现整个东西(渲染过滤器、捕获过滤器和 DLL)——而不是“成千上万”行代码。
    【解决方案2】:

    我认为您的问题超出了本网站的全部范围。如果你要自己编写这个软件,你说的是成千上万行代码和驱动程序、视频解码、混合等方面的深入知识。

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

    【讨论】:

      【解决方案3】:

      从真实网络摄像头捕捉视频:Video Capture on MSDN

      假网络摄像头:众所周知的起点是 Vivek 的示例/项目,可在 http://tmhare.mvps.org/downloads.htm 获取,另请参阅此帖子 "Fake" DirectShow video capture device

      聚在一起是可行的,虽然不是微不足道的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-06
        相关资源
        最近更新 更多