Ya estamos aquí con un tercer post sobre tomar fotos con JavaScript. Este tutorial ofrece una nueva característica y es la de dar al usuario elegir cuál cámara usar para tomar la foto. En los posts anteriores únicamente tomaba de la cámara por defecto, y en algunos navegadores (Chrome, cof cof) no permite cambiar la cámara con la que se toma.
Afortunadamente eso no importa, porque podemos obtener la lista de dispositivos y cambiarlos como se nos dé la gana.
Por cierto, este post está más actualizado; usa constantes, querySelector y otras cosas que los anteriores no. Si bien esto no afecta el funcionamiento, nos da un código más bonito y entendible.
Pero basta de hablar, que hablar es de mal gusto; vamos a ver el código.
En caso de que se me haya pasado explicar algo, puedes revisar las versiones anteriores de este post.
Tomar foto con cámara y JavaScript
Tomar foto con cámara y JavaScript v2
Compatible y probado con Edge, Firefox y Chrome en la fecha 22 de octubre del 2018. Puedes probarlo tú mismo y dejar en los comentarios si sigue funcionando (debería hacerlo por mucho tiempo).
En las siguientes imágenes he probado este código en el navegador, cubriendo obviamente mi cámara. Pruébalo tú si quieres y verás que funciona como un encanto.
Como siempre, aquí dejo un link en donde puedes probar el proyecto. Si no confías simplemente cubre tu cámara.
Por cierto, puedes descargar el código y probarlo en localhost o en un servidor con https.
Si lo deseas, puedes explorar el código de ejemplo en GitHub. Si más tarde hago actualizaciones podrás verlas directamente ahí. El repositorio está aquí.
Aquí está el código del script:
Es casi igual que el anterior, la lógica no cambia mucho.
Para poder listar los dispositivos llamamos a navigator.mediaDevices.enumerateDevices
, lo que devuelve una lista de los mismos, que pueden ser micrófonos y otras cosas.
Si te fijas, estamos llamando dos veces a ese método, ¿por qué? bueno, primero lo llamamos para ver si hay algún dispositivo para comenzar el stream, pero para ese tiempo el usuario no ha dado permisos, por lo que este método únicamente devuelve el id de los dispositivos, más no el nombre. Si no nos da el nombre, no podremos llenar el select de una buena manera.
Una vez que el usuario da permisos, volvemos a llamar a ese método para que nos dé los dispositivos. Como en este caso ya tenemos permisos, también devolverá el nombre de los mismos. Esto es más que nada por la seguridad.
Cuando hay más de un dispositivo, el select los muestra y al cambiarlos se usa esa cámara.
XMLHttpRequest
es una API que ya tiene años. Claro, es el estándar y los frameworks que usamos para hacer peticiones AJAX simplemente son una capa que nos permite interactuar con esta API.
Sin embargo, nosotros no estamos usando ningún framework, así que teníamos que usar XMLHttpRequest
, pero ya no más, ahora usamos fetch
(pronto escribiré sobre ello), ya que estamos explotando las nuevas características de JS.
En el código HTML también se hicieron cambios. Se movieron algunos elementos pero lo más importante es que se agregó el atributo muted al elemento <video>
por las políticas del navegador Chrome (y tal vez todos lo hagan así). Esto no afecta en nada porque nosotros únicamente mostramos vídeo y no audio, pero igual se tiene que especificar.
El código queda así:
Por cierto, puse unos estilos para que en móviles el vídeo ocupe el ancho de la pantalla pero no se pase más allá.
El código se queda intacto, pero aquí lo pego igualmente.
El código se encuentra comentado para explicarse por sí mismo. Si tienes una duda, comentario o sugerencia puedes usar los comentarios.
Te invito a explorar el código en GitHub, recuerda que dejé el link arriba.
En ocasiones es necesario leer los pixeles y colores de una imagen con JavaScript del…
Siguiendo con los tutoriales de listas desplegables o select con JavaScript, vamos a ver cómo…
Hoy vamos a ver programar la impresión de un PDF generado a partir de HTML…
En este tutorial básico de JavaScript con HTML vamos a ver cómo llenar una lista…
En este artículo se presenta una guía para imprimir un PDF a partir de una…
En este post voy a enseñarte cómo imprimir un PDF a partir de su representación…
Esta web usa cookies.
Ver comentarios
Excelente !!!!Muchas gracias mi estimado amigo, le agradezco por esta gran aporte en el desarrollo web!!!
Disculpa tengo una consulta
Como podría apagar el dispositivo WebCam mediante algún botón
Hola. Gracias por sus comentarios. Si tiene alguna consulta o duda, solicitud de creación de un programa o solicitud de cambio de software estoy para servirle en https://parzibyte.me/#contacto
Saludos!
Muy bueno, ya me funciona bien para capturar cámara y guardar, pero al usarlo en celular, a pesar que selecciona ambas cámaras, frontal y facing. No me funciona tomar foto con cámara frontal, solo funciona con cámara de selfies. Hay alguna linea de codigo para que funcionen ambas cámaras con celular?
Hola. Gracias por sus comentarios. Si tiene alguna consulta, solicitud de creación de un programa o solicitud de cambio de software con gusto lo atiendo en https://parzibyte.me/#contacto
Saludos!
hola tengo una consulta el escrp funciona muy bien pero cuando lo trabajo de forma local pero cuando lo subo y lo pruebo ya en linea me da un error que es el siguiente:
Uncaught TypeError: Cannot read property 'getUserMedia' of undefined
at tieneSoporteUserMedia (script.js:8)
at script.js:58
at script.js:163
pense que solo era en un navegador pero es en todos y en los dispositivos que puede ser me puedes ayudar.
que buen trabajo! y bien explicado, gracuas
Como puedo hacer para que me muestre o se recorte la imagen de la camara, para que se vea apaisado, como si fuera una foto para un id, la version 3 funciona a la perfeccion, pero me gustaria modificarlo para hacer fotos para id
por el canvas el tamaño del canvas seria el tamaño de la foto
Hola buen día, super bueno tu aporte, pero no me funciona al momento de ver la imagen tomada y al revisar en consola me sale un error 405 (Method Not Allowed), te pasó alguna vez? Saludos
Acuérdate que debe estar https
Hola. Yo acabo de probar y funciona perfectamente
Buenas tardes, esta muy bueno el codigo. lo descargue y lo estoy probando intacto como lo tienes en mi servidor. abre la pagina y apatece el boton tomar foto, pero el resto de cosas no aparece. me pide el permiso de usar la camara y se lo doy y no pasa nada. no sale el cuadro donde se ve la camara ni nada. que falto por hacer ?
Hola. El proyecto está completo, en la demostración funciona bien. Puede ser que sea problema de su servidor
Los mensajes son de éxito en la subida de la imagen pero no se guarda la imagen el server y me gustaría saber como guardar la imagen con un texto que provenga de una caja de texto.
Gracias por tu ayuda
Saludos
Ya lo pude subir al server, pero la otra pregunta es posible que me puedas ayudar por favor
Gracias
Hola. Con gusto lo ayudo en https://parzibyte.me#contacto
Saludos :)
Hola, seria posible que en lugar de escuchar el click del botón "Tomar foto" se guardara la foto si se hace click en la camara? (en caso de utilizar una camara conectada que disponga de boton para tomar la foto)
Hola. Por el momento no cuento con una cámara para probar, puede probar usted mismo y comentar su resultado
Saludos :)