1

我在Chrome 浏览器中使用Google meet进行在线视频会议。在 Google meet 中,我可以在视频设备中选择我的网络摄像头。我可以选择任何真正的硬件或虚拟网络摄像头,而且效果很好。

我确信 Chrome 会检测到所有真实或虚拟的网络摄像头看到的内容chrome://media-internals/

在此处输入图像描述

MediaDevices.enumerateDevices()只显示真正的硬件网络摄像头,而不显示虚拟网络摄像头。

<!DOCTYPE html>
<html>

<body>
    <script>
        (async () => {
            await navigator.mediaDevices.getUserMedia({ audio: true, video: true });
            let devices = await navigator.mediaDevices.enumerateDevices();
            console.log(devices);
        })();
    </script>
</body>

</html>

这是 devtools 中控制台的输出:

[
    {
        "deviceId": "",
        "kind": "audioinput",
        "label": "",
        "groupId": "a71e32bec65bc4788683c156cfbc3c005bce4535b980209e4a455973bd93f36a"
    },
    {
        "deviceId": "",
        "kind": "videoinput",
        "label": "",
        "groupId": "03e0a9c9e71757f81bef3f3a74c4a56785b2d3d103a7de883101e509c233977f"
    },
    {
        "deviceId": "",
        "kind": "audiooutput",
        "label": "",
        "groupId": "a71e32bec65bc4788683c156cfbc3c005bce4535b980209e4a455973bd93f36a"
    }
]

为什么 Google meet 和其他网站都显示所有摄像头,包括虚拟摄像头,为什么MediaDevices.enumerateDevices()不显示虚拟摄像头?

4

2 回答 2

3

空标签和enumerateDevices成功后仅显示默认设备是边缘情况,仅在对urlgetUserMedia进行测试时才会发生。file:///它应该https://在成功的 getUserMedia 调用授予对设备扩展列表的权限的 url(和 localhost)上正常工作(有关详细信息,请参阅此PSA

于 2021-08-25T09:49:02.133 回答
2

目前有两种用于 Windows 的媒体 API:DirectShow 和 Microsoft Media Foundation。早在 2000 年代初期,DirectShow 就取代了现已失效的 Video For Windows API。DirectShow 现在已被 Microsoft Media Foundation 取代,已被弃用。但是,Microsoft Media Foundation 尚未完成,仍有许多使用 DirectShow API 的捕获设备和软件。

我的猜测是虚拟网络摄像头使用 DirectShow,而真实网络摄像头的驱动程序提供 Media Foundation 和 DirectShow 的实现。可能是反过来,但我想你明白我的意思。现在,听起来MediaDevices.enumerateDevices()他们的视频捕获设备(可能是 Media Foundation)只使用了一种 Windows 媒体 API。这可以解释为什么虚拟网络摄像头不会出现在 JavaScript 中。

于 2021-08-24T17:16:38.477 回答