Capturar una imagen mediante la webcam con Javascript

3min

Con una webcam conectada a nuestro ordenador podemos enviar todo lo que en ella sucede en tiempo real y esa retransmisión, aparte de poder verse por el receptor, podemos guardarla o compartirla. Para que todo esto suceda, habitualmente vamos a necesitar un software específico que gestione la webcam y pueda realizar la retransmisión del vídeo capturado, aunque podríamos hacerlo sin ese software.

HTML5 y su método getUserMedia() nos permite mediante Javascript, el acceso a una previsualización del vídeo que muestra nuestra webcam, por lo que si la aplicación que estamos creando en nuestra web necesita acceder a ésta para emitir vídeo, lo podremos realizar fácilmente.

Índice

Método getUserMedia() de la API MediaDevices

Ates de aprender cómo manipular la cámara con Javascript, entremos un poco en materia con algunos conceptos básicos. Este método nos va a ayudar a crear MediaStream con los tipos multimedia solicitados. Lo primero que deberíamos hacer es usar getUserMedia para solicitar al usuario los permisos correspondientes al uso de la webcam y a partir de ahí podremos, mediante HTML5 y Javascript, capturar una imagen.

Código HTML a implementar

Vamos a crear un HTML que embeba el vídeo y muestre una imagen.

Elemento

Con él embebemos el vídeo en la página.

Botón de captura

Es el botón que ejecuta la acción de la captura.

Elemento

Dibuja la imagen que captura la webcam en ese momento. A continuación, el código con el orden que hemos explicado:

<!—Aquí el video embebido de la webcam -->
<div class='video-wrap'>
<video id='video' playsinline autoplay></video>
</div>
<!—El elemento canvas -->
<div class='controller'>
<button id='snap'>Capture</button>
</div>
<!—Botón de captura -->
<canvas id='canvas' width='640' height='480'></canvas> 

El Código Javascript a implementar

Por último, a la hora de manipular cámara con Javascript tendremos que escribir el código que gestione la transmisión a la página que hemos creado.

'use strict';

const video = document.getElementById('video');
const snap = document.getElementById('snap');
const canvas = document.getElementById('canvas');
const errorMsgElement = document.querySelector('span#errorMsg');

const constraints = {
audio: true,
video: {
width: 800, height: 600
}
};

// Acceso a la webcam
async function init() {
try {
const stream = await navigator.mediaDevices.getUserMedia(constraints);
handleSuccess(stream);
} catch (e) {
errorMsgElement.innerHTML = `navigator.getUserMedia error:${e.toString()}`;
}
}
// Correcto!
function handleSuccess(stream) {
window.stream = stream;
video.srcObject = stream;
}
// Load init
init();
// Dibuja la imagen
var context = canvas.getContext('2d');
snap.addEventListener('click', function() {
context.drawImage(video, 0, 0, 640, 480);
});

Vamos a explicar algunas cosas del código anterior: utilizaremos constantes que definirán el ancho y alto del vídeo que queremos mostrar en pantalla.

  • Con la función init() iniciaremos la API del método getUserMedia().
  • La transmisión del vídeo de la webcam lo haremos con la función handleSuccess().
  • Con la API del canvas podremos dibujar la captura de la webcam.

Conclusión

Como hemos visto, las APIs que tiene HTML5, en ocasiones, pueden ser suficientes para crear aplicaciones independientes del dispositivo y sencillas de desplegar.

Fernán García de Zúñiga

Productos relacionados: