MediaDevices.enumerateDevices() не показывает виртуальную веб-камеру в браузере, но Google Meet показывает
Я использую Google Meet в браузере Chrome для онлайн-видеоконференций. В Google Meet я могу выбрать свою веб-камеру в видеоустройствах. Я могу выбрать любое реальное оборудование или виртуальную веб-камеру, и все работает хорошо.
Но показывает только настоящую аппаратную веб-камеру и не показывает виртуальные веб-камеры.
<!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>
Почему Google Meet показывает виртуальную камеру и почему
MediaDevices.enumerateDevices()
не показывает виртуальную камеру?
2 ответа
Пустая метка и только устройства по умолчанию, показанные в
enumerateDevices
после успешного
getUserMedia
это крайний случай, который может произойти только при тестировании на
file:///
URL-адреса. Он должен нормально работать на
https://
URL-адреса (и на localhost), где успешный вызов getUserMedia предоставляет разрешение на расширенный список устройств (подробности см. в этом PSA )
Сегодня для 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()
использует только один из Windows Media API для своего устройства видеозахвата (возможно, Media Foundation). Это объясняет, почему виртуальные веб-камеры не отображаются в JavaScript.