在我的网络应用程序中检测内置摄像头和虚拟网络摄像头

问题描述 投票:0回答:2

如果用户使用任何虚拟摄像头,我想自动选择笔记本电脑的默认摄像头(内置摄像头)。我想阻止用户在网络应用程序中使用虚拟相机。

我可以在网络浏览器中获取可用的摄像机列表。但是我无法检测到哪个是虚拟相机,哪个是内置相机。

const devices = await navigator.mediaDevices.enumerateDevices();
const videoDevices = devices.filter((device) => device.kind === "videoinput");

在 videoDevices 中,我获得了所有可用摄像头(内置摄像头和虚拟摄像头)的所有信息。

但问题是如何检测哪个是虚拟相机,哪个是内置相机。

javascript webapi getusermedia mediadevices virtual-webcam
2个回答
0
投票

不幸的是,没有万无一失的方法来检测摄像头是虚拟的还是内置的,因为这取决于虚拟摄像头软件的实现。

然而,您可以采取的一种可能的方法是检查相机的设备 ID 或标签,其中可能包含设备 ID 或标签中的特定关键字,例如“OBS”、“ManyCam”或“Snap Camera”。

const virtualCameraSoftware = ['OBS', 'ManyCam', 'Snap Camera'];
const devices = await navigator.mediaDevices.enumerateDevices();
const videoDevices = devices.filter((device) => device.kind === 'videoinput');
const defaultCamera = videoDevices.find(device => !virtualCameraSoftware.some(keyword => device.deviceId.includes(keyword) || device.label.includes(keyword))));

第二种方法

const { exec } = require('child_process');

async function checkVirtualCameras() {
  return new Promise((resolve, reject) => {
    exec('reg query HKLM\\SYSTEM\\CurrentControlSet\\Control\\MediaResources\\MediaClass\\{65E8773D-8F56-11D0-A3B9-00A0C9223196}\\Instance /s', (error, stdout, stderr) => {
      if (error) {
        reject(error);
      } else {
        const virtualCameras = stdout.match(/\{[\w-]+\}/g); // match GUIDs of virtual cameras
        resolve(virtualCameras);
      }
    });
  });
}

const devices = await navigator.mediaDevices.enumerateDevices();
const videoDevices = devices.filter((device) => device.kind === "videoinput");

const virtualCameras = await checkVirtualCameras();

const defaultCamera = videoDevices.find((device) => {
  if (!virtualCameras.includes(device.groupId)) {
    return true;
  }
});

希望这有效!


-1
投票

navigator.mediaDevices.enumerateDevices()
  .then(devices => {
    let videoInputs = devices.filter(device => device.kind === 'videoinput');
    let groups = {};

    videoInputs.forEach(device => {
      if (device.groupId in groups) {
        groups[device.groupId].push(device);
      } else {
        groups[device.groupId] = [device];
      }
    });

    Object.values(groups).forEach(group => {
      if (group.some(device => device.label.toLowerCase().includes('virtual'))) {
        console.log(group[0].label + ' is a virtual camera.');
      } else {
        console.log(group[0].label + ' is a system built-in camera.');
      }
    });
  })
  .catch(err => {
    console.error('Error getting media devices: ', err);
  });

我希望这会奏效!!

© www.soinside.com 2019 - 2024. All rights reserved.