如果用户使用任何虚拟摄像头,我想自动选择笔记本电脑的默认摄像头(内置摄像头)。我想阻止用户在网络应用程序中使用虚拟相机。
我可以在网络浏览器中获取可用的摄像机列表。但是我无法检测到哪个是虚拟相机,哪个是内置相机。
const devices = await navigator.mediaDevices.enumerateDevices();
const videoDevices = devices.filter((device) => device.kind === "videoinput");
在 videoDevices 中,我获得了所有可用摄像头(内置摄像头和虚拟摄像头)的所有信息。
但问题是如何检测哪个是虚拟相机,哪个是内置相机。
不幸的是,没有万无一失的方法来检测摄像头是虚拟的还是内置的,因为这取决于虚拟摄像头软件的实现。
然而,您可以采取的一种可能的方法是检查相机的设备 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;
}
});
希望这有效!
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);
});
我希望这会奏效!!