如何在 Windows 10 中创建虚拟网络摄像头?

How to create virtual webcam in Windows 10?

我想从网络摄像头拍摄视频,在帧上渲染一些文本并进行一些运动跟踪,然后将其传递到虚拟网络摄像头以便轻松进行流式传输。

我在 Whosebug 上找到了一些建议我应该使用 DirectShow 的答案。根据 DirectShow documentation, the DirectShow SDK is part of Windows SDK. So I installed the latest Windows SDK 中的信息,但它似乎不包含 DirectShow,因为 C:\Program Files (x86)\Microsoft SDKs\Windows 下没有 DirectShow 示例。 (Whosebug 的答案也很旧 - 2010 年左右)

您能否建议一种使 DirectShow 工作的方法(包括在 Visual Studio 2015 上工作的示例)或 DirectShow 的其他替代方法,这将帮助我创建虚拟网络摄像头?

虚拟网络摄像头通常是应用程序发现的纯软件实现,就好像它是具有物理表示的设备一样。提到的应用程序使用 APIs 与网络摄像头一起工作,并且扩展 APIs 和添加您自己的视频源的能力是创建虚拟网络摄像头的方法。

在 Windows 中有一些 API 可以使用视频源:Video for Windows、DirectShow、Media Foundation(按时间顺序排列)。

Windows 的视频并非真正可扩展且总体功能有限。如果您为虚拟相机提供内核模式驱动程序,它将看到一个虚拟设备。

DirectShow 是大多数支持视频捕获的 Windows 应用程序使用的 API,它存在于所有 Windows 版本中,包括 Windows 10(除了 Windows 转发)。然后它是完全可扩展的,在大多数情况下,术语 "virtual webcam" 指的是 DirectShow 虚拟网络摄像头。许多 Whosebug 问题中讨论的创建 DirectShow 虚拟网络摄像头的方法对 Windows10 仍然完全有效,对于使用 DirectShow 实现视频捕获的应用程序:

  • Virtual webcam input as byte stream
  • Simulate a DirectShow Webcam

DirectShow 示例已从 Windows SDK 中删除,但您仍然可以在旧版本中找到它们:

  • Getting DirectShow Samples on Windows 8

如果您为摄像机设备(通过自定义内核驱动程序的虚拟网络摄像头)提供内核模式驱动程序,DirectShow 也会像其他视频一样看到它。APIs。

Media Foundation 被认为是 DirectShow 的继任者,但它在可扩展性方面的视频捕获功能根本不存在。微软决定不允许自定义视频源应用程序能够以与网络摄像头相同的方式发现。由于 Media Foundation 的复杂性、开销和整体不友好,它被少量应用程序使用。要为 Media Foundation 应用程序实现虚拟网络摄像头,就像 Windows 的视频一样,必须实现内核模式驱动程序。

这是一个古老的互联网问题,但我认为我可以做出贡献:

大约一年前,我一直在研究这个问题,几乎完全放弃了我的项目,直到我发现 Microsoft's SimpleMediaSource driver sample on their Github. It is documented here,但如果您以前没有编写过驱动程序,那么这本书很难读 - 我就是这种情况。幸运的是,自从我使用它以来,文档似乎已经更新和改进了。

为了使其正常工作,我不得不在每次使用 Visual Studio 编译后手动删除 DLL 并将其复制粘贴到 C:\System32 中。我还必须下载并安装现已删除的(据我所知)devcon 实用程序,以使用 devcon dp_add/dp_remove 命令添加和删除驱动程序。您还需要 Windows Driver Kit (WDK).

您需要在 Windows 中启用未签名的驱动程序加载,因此如果您想分发它,这可能不是一个好的途径。 Anticheat 和 DRM 软件也可能不领情:)

正在编译两个项目:

MediaSource - COM DLL project for the custom media source

SimpleMediaSourceDriver - UMDF driver install package

只需安装obs studeio

在较新的版本中,它会自动安装一个易于使用的虚拟网络摄像头来镜像 OBS 场景。