Cómo activar la cámara y capturar vídeos desde tu PWA | PWA Experts I/O

Cómo activar la cámara y capturar vídeos desde tu PWA

En este tutorial aprenderemos a utilizar la API nativa de navegador que nos permite activar la cámara de nuestro ordenador y dispositivo móvil y capturar vídeos con audio.

Gif giphy

🎥 Aprende a capturar vídeos desde la cámara con tan sólo un poco de HTML y algo de JavaScript

Volvemos con un nuevo tutorial que enlaza sí o sí con uno anterior, en el que hablamos sobre cómo activar el micrófono en tu PWA. En esta ocasión, os quería presentar una variante sobre la api "MediaRecorder" en la que, además de capturar audio desde el micrófono de tu ordenador o móvil, puedes capturar vídeo. Genial, ¿no? :)

Demo

Recordemos: Qué es la API MediaStream Recording

La API de proceso MediaStream, a veces llamada Media Stream API o Stream API, es parte de la norma WebRTC y describe un flujo de datos de audio o video. Los métodos para trabajar con ellos, las limitaciones asociadas con este tipo de datos, las respuestas de error y éxito, al usar los datos asincrónicamente y, los eventos que se disparan durante el proceso.

De nuevo, los principales eventos con los que trabajaremos serán "start", "stop" y "dataavailable".

Cómo obtener vídeo desde una Progressive Web Application

Lo primero que debemos hacer, es utilizar el método "MediaDevices.getUserMedia()" con el que otorgar al usuario, mediante una ventana emergente, la posibilidad de aceptar los permisos de activación de la cámara desde el navegador.

Permisos navegador

En este caso, debemos proporcionar las propiedades "audio" y "video" con valor true para que estos permisos sean efectivos en ambos features.


  // Declare global variables.
  const globalStream = null;
  
  // Active permisions of navigator for record video with audio.
  navigator.mediaDevices
    .getUserMedia({ audio: true, video: true })
    .then((stream) => { 
      globalStream = stream;
    });

Como segundo paso es necesario, al igual que con el audio, instanciar el objeto "MediaRecorder" con el tipo de dato o mimeType en el que queramos almacenar el vídeo, teniendo siempre en cuenta los que están y no disponibles en cada navegador.


  // Define config.
  const config = {mimeType: 'video/webm'};
  const globalStream = null;

  // Init instance MediaRecorder.
  const mediaRecorder = new MediaRecorder(globalStream, config);  

Aquí os dejo dos enlaces de interés:
MDN Mozilla - MediaRecorder.mimeType
MDN Mozilla - Web video codec guide

En tercer lugar, trabajaremos con los listener necesarios. Por un lado con "dataavailable" que nos permitirá ir almacenando trozo a trozo, o como comúnmente se llama “chunk a chunk”, cada parte del video que estamos generando para que, tras finalizar todo nuestro vídeo, podamos generar una url de archivo para su envío a un servidor o descarga del mismo.

Aquí os dejo un pequeño ejemplo de código en relación a esto último:


  // Declare array empty for save chunks.
  let recordedChunks = [];

  // Event for save data recorered into array chunks.
  mediaRecorder.addEventListener('dataavailable', (e) => {
    if (e.data.size > 0) {
      recordedChunks.push(e.data);
    }
  });

  // Event stop where you can execute custom actions.
  mediaRecorder.addEventListener('stop', function() {
    console.log('addEventListener stop');

    // Create object url from blob.
    const objectRef = URL.createObjectURL(new Blob(recordedChunks));
  });

Finalmente, estos eventos hay que lanzarlos de alguna forma. A modo de PoC, puedes crearte un proyecto que tenga dos elementos “button” en tu archivo index.html con los que ejecutar los métodos "mediaRecorder.start()" y "mediaRecorder.stop()".


  // Start recorder event of media recorder instance.
  mediaRecorder.start();

  // Stop recorder event of media recorder instance.
  mediaRecorder.stop();

Streaming de vídeo y audio

Sí, estás en lo cierto, estamos hablando de poder crear un proyecto web con el que poder realizar streaming de contenido visual como cualquiera de las plataformas que hay actualmente en el mercado. Ten en cuenta que al estar utilizando tecnología nativa del navegador, al igual que estas otras plataformas, te acercas a la posibilidad de crear un simple y a su vez complejo servicio de grabación/emisión de contenido visual por Streaming. Mola, ¿no? :)

Ejemplo boton play

Sé que de cara a toda la parte del back no hemos hablado pero, por ahora está bien con tener en mente que desde la parte front, podemos ya crearnos un proyecto y la lógica del mismo para que, a futuro, podamos crear el back y que nuestros videos se puedan emitir en tiempo real a otros usuarios mediante nuestro propio proyecto web.

Ejemplo

Finalmente os dejo un ejemplo en mi cuenta de GitHub que podréis probar en vuestro ordenador o dispositivo móvil: Tutorial PWA Video Capture

Si tienes dudas, deja un comentario para que entre todos podamos ir mejorando.

Espero que os haya gustado y gracias por leerlo! 😝

#PWA#Cámara#Vídeo

Para dejar tu comentarios debes pertenecer a la Comunidad.

Entra en la Comunidad

¿Quieres aprender sobre las PWAs, colaborar en el desarrollo de la plataforma, redactar artículos, publicar tutoriales y mucho más? Únete a la Comunidad PWA Experts I/O.

WIP: Work in Progress

Estas son las próximas mejoras que presentaremos en la Comunidad, ¿te apetece colaborar?

  • 🔚 Incluir resumen de los features de las PWA por navegador.
  • 🔚 Agregar avisos vía email con las respuestas en los hilos del foro.
  • 🔜 Implementación del Service Workers.
  • 🔜 Newsletters.