La cámara y el micrófono se bloquean manualmente en Chrome (como se muestra en la imagen a continuación): 
Las pistas de medios locales se crean utilizando los métodos de la biblioteca de video twilio createLocalAudioTrack y createLocalVideoTrack , que arroja la siguiente excepción:
DOMException: Permission denied code: 0 message: "Permission denied" name: "NotAllowedError"Al intentar usar getUserMedia nativo del navegador de la siguiente manera:
navigator.mediaDevices.getUserMedia({ audio: true, video: true }) .catch(error => { console.log(error) })la consola registra la misma excepción en el bloque catch:
DOMException: Permission deniedLa pregunta: ¿es posible saber de antemano, antes de crear pistas de medios locales, que no hay permisos para hacerlo (la cámara y el micrófono se bloquean manualmente en un navegador) y solicitar dichos permisos mediante programación (mostrar una ventana emergente solicitando los permisos) para crear ¿las pistas?
Tenga en cuenta que, en el momento en que escribo, este es todavía un territorio experimental.
Puede consultar los permisos usando Permissions.query() :
const permissionDescriptors = [ {name: 'camera'}, {name: 'microphone'}, ]; const permissions = await Promise.all(permissionDescriptors.map(async descriptor => ({ descriptor, status: await navigator.permissions.query(descriptor), }))); for (const {descriptor, status} of permissions) { console.log( descriptor.name, // 'camera' | 'microphone' status.state, // 'granted' | 'denied' | 'prompt' ); } Podrá solicitar permisos mediante Permissions.request() . Sin embargo, esto no es compatible actualmente con ningún navegador.
Hoy, es mejor simplemente intentar acceder a MediaStream y capturar y manejar una posible excepción:
let mediaStream; try { const constraints = { audio: true, video: true }; mediaStream = await navigator.mediaDevices.getUserMedia(constraints); } catch (ex) { if (ex instanceof DOMException) { if (ex.name === 'NotAllowedError') { // handle permission denied } else if (ex.name === 'NotFoundError') { // handle media not found } else { // handle unexpected DOMException } } else { // handle unexpected error } } if (!mediaStream) { // handle no stream } else { // do something with stream }