Hola, hallamos la solución a lo que andabas buscando, continúa leyendo y la verás más abajo.
los MediaDevices
.getUserMedia()
El método solicita al usuario permiso para usar una entrada de medios que produce un MediaStream
con pistas que contienen los tipos de medios solicitados. Esa transmisión puede incluir, por ejemplo, una pista de video (producida por un hardware o una fuente de video virtual, como una cámara, un dispositivo de grabación de video, un servicio para compartir pantalla, etc.), una pista de audio (de manera similar, producida por un dispositivo físico o fuente de audio virtual como un micrófono, convertidor A / D o similar) y posiblemente otros tipos de pistas.
Devuelve un Promise
que se resuelve en un MediaStream
objeto. Si el usuario deniega el permiso o no hay medios coincidentes disponibles, la promesa se rechaza con NotAllowedError
o NotFoundError
respectivamente.
Nota: Es posible que la promesa devuelta ninguno resolver ni rechazar, ya que el usuario no está obligado a hacer una elección en absoluto y puede ignorar la solicitud.
Generalmente, accederá al MediaDevices
objeto singleton usando navigator.mediaDevices
, como esto:
asyncfunctiongetMedia(constraints)let stream =null;try stream =await navigator.mediaDevices.getUserMedia(constraints);/* use the stream */catch(err)/* handle the error */
De manera similar, al usar las promesas sin procesar directamente, el código se ve así:
navigator.mediaDevices.getUserMedia(constraints).then(function(stream)/* use the stream */).catch(function(err)/* handle the error */);
Nota: Si el documento actual no se carga de forma segura, navigator.mediaDevices
estarán undefined
, y no puedes usar getUserMedia()
. Consulte Seguridad para obtener más información sobre este y otros problemas de seguridad relacionados con el uso getUserMedia()
.
Sintaxis
var promise = navigator.mediaDevices.getUserMedia(constraints);
Parámetros
constraints
-
A
MediaStreamConstraints
objeto que especifica los tipos de medios a solicitar, junto con los requisitos para cada tipo.los
constraints
el parámetro es unMediaStreamConstraints
objeto con dos miembros:video
yaudio
, describiendo los tipos de medios solicitados. Se debe especificar uno o ambos. Si el navegador no puede encontrar todas las pistas de medios con los tipos especificados que cumplen con las restricciones dadas, la promesa devuelta se rechaza conNotFoundError
.Lo siguiente solicita tanto audio como video sin ningún requisito específico:
audio:true, video:true
Si
true
se especifica para un tipo de medio, el flujo resultante es requerido tener ese tipo de pista en ella. Si uno no puede ser incluido por alguna razón, la llamada agetUserMedia()
resultará en un error.Si bien la información sobre las cámaras y los micrófonos de un usuario es inaccesible por razones de privacidad, una aplicación puede solicitar las capacidades de la cámara y el micrófono que necesita y desea, utilizando restricciones adicionales. A continuación se expresa una preferencia por la resolución de la cámara de 1280×720:
audio:true, video: width:1280, height:720
El navegador intentará respetar esto, pero puede devolver otras resoluciones si no hay una coincidencia exacta disponible o el usuario la anula.
Para exigir una capacidad, use las palabras clave
min
,max
, oexact
(también conocido comomin == max
). Lo siguiente exige una resolución mínima de 1280×720:audio:true, video: width: min:1280, height: min:720
Si no existe una cámara con esta resolución o superior, la promesa devuelta será rechazada con
OverconstrainedError
y no se le pedirá al usuario.La razón de la diferencia de comportamiento es que las palabras clave
min
,max
, yexact
son inherentemente obligatorias. Mientras que los valores simples y una palabra clave llamadaideal
no son. Aquí tienes un ejemplo completo:audio:true, video: width: min:1024, ideal:1280, max:1920, height: min:576, ideal:720, max:1080
Un
ideal
El valor, cuando se usa, tiene gravedad, lo que significa que el navegador intentará encontrar la configuración (y la cámara, si tiene más de una), con la más pequeña distancia de fitness de los valores ideales dados.Los valores simples son inherentemente ideales, lo que significa que el primero de nuestros ejemplos de resolución anteriores podría haberse escrito así:
audio:true, video: width: ideal:1280, height: ideal:720
No todas las restricciones son números. Por ejemplo, en dispositivos móviles, los siguientes preferirán la cámara frontal (si hay una disponible) a la trasera:
audio:true, video: facingMode:"user"
Para exigir la cámara trasera, utilice:
audio:true, video: facingMode: exact:"environment"
Otra restricción no numérica es la
deviceId
restricción. Si tienes undeviceId
demediaDevices.enumerateDevices()
, puedes usarlo para solicitar un dispositivo específico:video: deviceId: myPreferredCameraDeviceId
Lo anterior devolverá la cámara que solicitó, o una cámara diferente si esa cámara específica ya no está disponible. De nuevo, para exigir la cámara específica, usarías:
video: deviceId: exact: myExactCameraOrBustDeviceId
Valor devuelto
A Promise
cuyo controlador de cumplimiento recibe un MediaStream
objeto cuando el medio solicitado se haya obtenido con éxito.
Excepciones
Los rechazos de la promesa devuelta se realizan pasando un DOMException
objeto de error al manejador de fallas de la promesa. Los posibles errores son:
AbortError
- Aunque el usuario y el sistema operativo otorgaron acceso al dispositivo de hardware, y no se produjeron problemas de hardware que pudieran causar una
NotReadableError
, se produjo algún problema que impidió el uso del dispositivo. NotAllowedError
- Uno o más de los dispositivos de origen solicitados no se pueden utilizar en este momento. Esto sucederá si el contexto de navegación es inseguro (es decir, la página se cargó usando HTTP en lugar de HTTPS). También ocurre si el usuario ha especificado que la instancia de navegación actual no tiene permitido el acceso al dispositivo, el usuario ha denegado el acceso para la sesión actual o el usuario ha denegado todo el acceso a los dispositivos multimedia del usuario a nivel mundial. En navegadores que admiten la gestión de permisos multimedia con Política de funciones, este error se devuelve si la Política de funciones no está configurada para permitir el acceso a las fuentes de entrada. Versiones anteriores de la especificación utilizadas
SecurityError
por esto en su lugar;SecurityError
ha adquirido un nuevo significado. NotFoundError
- No se encontraron pistas de medios del tipo especificado que satisfagan las restricciones dadas.
NotReadableError
- Aunque el usuario otorgó permiso para usar los dispositivos coincidentes, se produjo un error de hardware en el sistema operativo, el navegador o la página web que impidió el acceso al dispositivo.
OverconstrainedError
- Las restricciones especificadas dieron como resultado ningún dispositivo candidato que cumpliera con los criterios solicitados. El error es un objeto de tipo
OverconstrainedError
y tiene unconstraint
propiedad cuyo valor de cadena es el nombre de una restricción que era imposible de cumplir, y unamessage
propiedad que contiene una cadena legible por humanos que explica el problema. Debido a que este error puede ocurrir incluso cuando el usuario aún no ha otorgado permiso para usar el dispositivo subyacente, se puede usar potencialmente como una superficie de huellas digitales. SecurityError
- El soporte de medios de usuario está deshabilitado en el
Document
en la quegetUserMedia()
fue llamado. El mecanismo por el cual se habilita y deshabilita el soporte de medios de usuario se deja en manos del agente de usuario individual. TypeError
- La lista de restricciones especificadas está vacía o tiene todas las restricciones establecidas en
false
. Esto también puede suceder si intenta llamargetUserMedia()
en un contexto inseguro, ya quenavigator.mediaDevices
esundefined
en un contexto inseguro.
Privacidad y seguridad
Como API que puede implicar importantes problemas de privacidad, getUserMedia()
La especificación establece una amplia gama de requisitos de privacidad y seguridad que los navegadores están obligados a cumplir.
getUserMedia()
es una característica poderosa que solo se puede utilizar en contextos seguros; en contextos inseguros, navigator.mediaDevices
es undefined
, impidiendo el acceso a getUserMedia()
. Un contexto seguro es, en resumen, una página cargada usando HTTPS o el file:///
Esquema de URL o una página cargada desde localhost
.
Además, siempre se requiere permiso del usuario para acceder a las entradas de audio y video del usuario. Solo el contexto del documento de nivel superior de una ventana para un origen válido puede incluso solicitar permiso para usar getUserMedia()
, a menos que el contexto de nivel superior conceda expresamente permiso para un determinado para hacerlo usando Política de funciones. De lo contrario, nunca se le pedirá permiso al usuario para usar los dispositivos de entrada.
Para obtener detalles adicionales sobre estos requisitos y reglas, cómo se reflejan en el contexto en el que se ejecuta su código y cómo los navegadores gestionan los problemas de seguridad y privacidad del usuario, siga leyendo.
Privacidad del usuario
Como API que puede implicar importantes problemas de privacidad, getUserMedia()
está sujeto a la especificación de requisitos muy específicos para la notificación de usuarios y la gestión de permisos. Primero, getUserMedia()
siempre debe obtener el permiso del usuario antes de abrir cualquier entrada de recopilación de medios, como una cámara web o un micrófono. Los navegadores pueden ofrecer una función de permiso de una vez por dominio, pero deben solicitarla al menos la primera vez, y el usuario debe otorgar específicamente un permiso continuo si así lo desea.
De igual importancia son las reglas en torno a la notificación. Los navegadores deben mostrar un indicador que muestre que se está usando una cámara o un micrófono, más allá de cualquier indicador de hardware que pueda existir. También deben mostrar un indicador de que se ha otorgado permiso para usar un dispositivo para la entrada, incluso si el dispositivo no está grabando activamente en este momento.
Por ejemplo, en Firefox, la barra de URL muestra un icono rojo intermitente para indicar que la grabación está en curso. El icono es gris si el permiso está en su lugar, pero la grabación no está en curso. La luz física del dispositivo se utiliza para indicar si la grabación está activa o no. Si ha silenciado su cámara (lo que se denomina “silenciamiento facial”), la luz de actividad de la cámara se apaga para indicar que la cámara no le está grabando activamente, sin descartar el permiso para reanudar el uso de la cámara una vez finalizado el silenciamiento.
Seguridad
Hay varias formas de control y gestión de la seguridad en un agente de usuario puede causar getUserMedia()
para devolver un error relacionado con la seguridad.
Nota: El modelo de seguridad para getUserMedia()
todavía está algo en cambio. El mecanismo de seguridad diseñado originalmente está en proceso de ser reemplazado por la Política de funciones, por lo que varios navegadores tienen diferentes niveles de soporte de seguridad, utilizando diferentes mecanismos. Debe probar su código cuidadosamente en una variedad de dispositivos y navegadores para asegurarse de que sea lo más compatible posible
Política de funciones
los Política de funciones función de gestión de seguridad de HTTP está en proceso de ser introducido en los navegadores, con soporte disponible hasta cierto punto en muchos navegadores (aunque no siempre está habilitado de forma predeterminada, como en Firefox). getUserMedia()
es un método que requerirá el uso de la Política de funciones, y su código debe estar preparado para lidiar con esto. Por ejemplo, es posible que deba utilizar el allow
atributo en cualquier que usa
getUserMedia()
y páginas que usan getUserMedia()
eventualmente necesitará suministrar el Feature-Policy
encabezamiento.
Los dos permisos que se aplican a getUserMedia()
están camera
y microphone
.
Por ejemplo, esta línea en los encabezados HTTP permitirá el uso de una cámara para el documento y cualquier elementos que se cargan desde el mismo origen:
Feature-Policy: camera 'self'
Esto solicitará acceso al micrófono para el origen actual y el origen específico https://developer.mozilla.org:
Feature-Policy: microphone 'self' https://developer.mozilla.org
Si estas usando getUserMedia()
dentro de un , puede solicitar permiso solo para ese marco, que es claramente más seguro que solicitar un permiso más general. Aquí, indique que necesitamos la capacidad de usar tanto la cámara como el micrófono:
<iframesrc="https://mycode.example.net/etc"allow="camera;microphone">iframe>
Lea nuestra guía, Uso de la política de funciones, para obtener más información sobre cómo funciona.
Seguridad basada en cifrado
los getUserMedia()
El método solo está disponible en contextos seguros. Un contexto seguro es aquel en el que el navegador está razonablemente seguro de que contiene un documento que se cargó de forma segura, utilizando HTTPS / TLS, y tiene una exposición limitada a contextos inseguros. Si un documento no se carga en un contexto seguro, el navigator.mediaDevices
la propiedad es undefined
, haciendo acceso a getUserMedia()
imposible.
Intentando acceder getUserMedia()
en esta situación resultará en un TypeError
.
Seguridad de la fuente de documentos
Debido a la obvia preocupación de seguridad asociada con getUserMedia()
si se utiliza de forma inesperada o sin que la seguridad se gestione con cuidado, solo se puede utilizar en contextos seguros. Hay varias formas inseguras de cargar un documento que, a su vez, podría intentar llamar getUserMedia()
. Los siguientes son ejemplos de situaciones en las que getUserMedia()
no se le permite ser llamado:
- Un documento cargado en un espacio aislado
el elemento no puede llamar
getUserMedia()
a menos que eltiene su
sandbox
atributo establecido enallow-same-origin
. - Un documento cargado con un
data://
oblob://
La URL que no tiene origen (como cuando el usuario escribe una de estas URL en la barra de direcciones) no puede llamargetUserMedia()
. Este tipo de URL cargadas desde código JavaScript heredan los permisos del script. - Cualquier otra situación en la que no haya origen, como cuando el
srcdoc
El atributo se utiliza para especificar el contenido de un marco.
Ejemplos de
Anchura y altura
Este ejemplo da preferencia a la resolución de la cámara y asigna el resultado MediaStream
objeto a un elemento de video.
// Prefer camera resolution nearest to 1280x720.var constraints = audio:true, video: width:1280, height:720; navigator.mediaDevices.getUserMedia(constraints).then(function(mediaStream)var video = document.querySelector('video'); video.srcObject = mediaStream; video.onloadedmetadata=function(e) video.play();;).catch(function(err) console.log(err.name +": "+ err.message););// always check for errors at the end.
Usando la nueva API en navegadores más antiguos
Aquí hay un ejemplo de uso navigator.mediaDevices.getUserMedia()
, con un polyfill para hacer frente a los navegadores más antiguos. Tenga en cuenta que este polyfill no corrige las diferencias heredadas en la sintaxis de restricciones, lo que significa que las restricciones no funcionarán bien en todos los navegadores. Se recomienda utilizar el adapter.js polyfill en su lugar, que maneja restricciones.
// Older browsers might not implement mediaDevices at all, so we set an empty object firstif(navigator.mediaDevices ===undefined) navigator.mediaDevices =;// Some browsers partially implement mediaDevices. We can't just assign an object// with getUserMedia as it would overwrite existing properties.// Here, we will just add the getUserMedia property if it's missing.if(navigator.mediaDevices.getUserMedia ===undefined) navigator.mediaDevices.getUserMedia=function(constraints)// First get ahold of the legacy getUserMedia, if presentvar getUserMedia = navigator.webkitGetUserMedia navigator.mediaDevices.getUserMedia( audio:true, video:true).then(function(stream)var video = document.querySelector('video');// Older browsers may not have srcObjectif("srcObject"in video) video.srcObject = stream;else// Avoid using this in new browsers, as it is going away. video.src = window.URL.createObjectURL(stream); video.onloadedmetadata=function(e) video.play();;).catch(function(err) console.log(err.name +": "+ err.message););
Cuadros por segundo
En algunos casos, pueden ser deseables velocidades de cuadro más bajas, como las transmisiones WebRTC con restricciones de ancho de banda.
var constraints = video: frameRate: ideal:10, max:15;
Cámara frontal y trasera
En teléfonos móviles.
var front =false; document.getElementById('flip-button').onclick=function() front =!front;;var constraints = video: facingMode:(front?"user":"environment");
Especificaciones
Especificación | Estado | Comentario |
---|---|---|
Captura de medios y transmisiones La definición de ‘MediaDevices.getUserMedia ()’ en esa especificación. |
Recomendación candidata | Definición inicial |
Compatibilidad del navegador
Escritorio | Móvil | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Cromo | Borde | Firefox | explorador de Internet | Ópera | Safari | WebView Android | Chrome Android | Firefox para Android | Opera Android | Safari en IOS | Internet de Samsung | |
getUserMedia |
53 Si necesita esta capacidad antes de la versión 53, consulte navigator.webkitGetUserMedia , una forma prefijada de la obsoleta navigator.getUserMedia API. |
12 | 36[“If you need this capability before version 36, refer to navigator.mozGetUserMedia , a prefixed form of the deprecated navigator.getUserMedia API.”, “Before Firefox 55, getUserMedia() incorrectly returns NotSupportedError when the list of constraints specified is empty, or has all constraints set to false . Starting in Firefox 55, this situation now correctly calls the failure handler with a TypeError .”, “When using the Firefox-specific video constraint called mediaSource to request display capture, Firefox 66 and later consider values of screen and window to both cause a list of screens and windows to be shown.”, “Starting in Firefox 66, getUserMedia() can no longer be used in sandboxed s or data URLs entered in the address bar by the user.”] |
No | 40 Si necesita esta capacidad antes de la versión 40, consulte navigator.webkitGetUserMedia , una forma prefijada de la obsoleta navigator.getUserMedia API. |
11 | 53 | 53 Si necesita esta capacidad antes de la versión 53, consulte navigator.webkitGetUserMedia , una forma prefijada de la obsoleta navigator.getUserMedia API. |
36[“If you need this capability before version 36, refer to navigator.mozGetUserMedia , a prefixed form of the deprecated navigator.getUserMedia API.”, “Before Firefox 55, getUserMedia() incorrectly returns NotSupportedError when the list of constraints specified is empty, or has all constraints set to false . Starting in Firefox 55, this situation now correctly calls the failure handler with a TypeError .”, “When using the Firefox-specific video constraint called mediaSource to request display capture, Firefox 66 and later consider values of screen and window to both cause a list of screens and windows to be shown.”, “Starting in Firefox 66, getUserMedia() can no longer be used in sandboxed s or data URLs entered in the address bar by the user.”] |
41 Si necesita esta capacidad antes de la versión 41, consulte navigator.webkitGetUserMedia , una forma prefijada de la obsoleta navigator.getUserMedia API. |
11 | 6.0 |
secure_context_required |
53 | 79 | 68 | No | 40 | ? | 53 | 53 | 68 | 41 | ? | 6.0 |
Ver también
- El mas viejo
navigator.getUserMedia()
API heredada. mediaDevices.enumerateDevices()
: Lista de dispositivos multimedia disponibles- API de WebRTC
- API de captura de medios y transmisiones (transmisiones de medios)
- API de captura de pantalla: captura de contenido de pantalla como
MediaStream
mediaDevices.getDisplayMedia()
: Obtener una secuencia que contiene el contenido de la pantalla- Tomar fotos de la cámara web: un tutorial sobre el uso
getUserMedia()
tomar fotos fijas en lugar de videos