En este post voy a explicar cómo grabar audio del micrófono con JavaScript, MediaRecorder y la API de getUserMedia.

Grabar audio del micrófono con JavaScript, getUserMedia y MediaRecorder

Grabar audio del micrófono con JavaScript, getUserMedia y MediaRecorder

Al final seremos capaces de:

  • Pedir permiso de acceder al micrófono
  • Obtener una lista de micrófonos
  • Seleccionar el micrófono para grabar
  • Comenzar una grabación
  • Detener la grabación de audio
  • Descargar el audio grabado

Todo eso sin usar plugins, extensiones ni esas cosas: se utiliza JavaScript puro.

Código fuente y recomendados

Aquí voy a explicar las cosas más importantes, pero el código actualizado puede verse en mi GitHub.

En caso de que quieras probar la aplicación final, visita este enlace.

Nota: recuerda que ya vimos cómo tomar una foto con JavaScript y la cámara web para descargar, o para enviarla a PHP.

Lista de dispositivos

Para obtener la lista de dispositivos llamamos a navigator.mediaDevices.enumerateDevices que devolverá una promesa que, al ser resuelta, traerá la lista.

Esta lista tiene todos los dispositivos pero a nosotros solo nos importan aquellos cuyo tipo (kind) sea de audioinput; hacemos un pequeño filtro y ponemos los dispositivos de grabación en un select o lista desplegable.

En algunos casos el dispositivo no tiene label, así que simplemente usamos las plantillas de cadena e indicamos “Dispositivo X”.

El punto importante es tener el deviceId, ya que ese es pasado cuando se llama a getUserMedia.

Comenzar grabación

Para grabar el audio creamos un MediaRecorder, su constructor acepta un stream que obtenemos con getUserMedia.

getUserMedia acepta un parámetro para que le indiquemos el dispositivo con el que vamos a grabar, el cual es el deviceId obtenido desde la lista desplegable.

En la llamada a getUserMedia se pedirá permiso al usuario, si el usuario accede y cuenta con el hardware de grabación entonces se resuelve la promesa; en caso de que no, se rechaza y manejamos el error en catch.

El verdadero comienzo de la grabación es en mediaRecorder.start (la variable es global, y no te confundas, es la variable, no la clase MediaRercorder).

La variable va a emitir el evento de dataavailable (data available, datos disponibles) el cual escuchamos. Dicho evento trae datos (que son la grabación, bueno, pedazos de ella) que colocamos en un arreglo.

Detener grabación y escuchar evento

Para detener la grabación llamamos a mediaRecorder.stop(), eso desencadenará el evento stop, el cual escuchamos y dentro del mismo:

  • Detenemos la pista del stream
  • Convertimos el arreglo de fragmentos de la grabación a un Blob
  • Descargamos el blob como webm

Eso lo hace el siguiente código:

Descargar audio grabado con JavaScript

Descargar audio grabado con JavaScript

Extra: el conteo

Para mostrar el tiempo que se lleva grabado puse un contador que muestra el tiempo de inicio de la grabación, el mismo se resetea cuando se descarga el audio.

¿Por qué webm?

No quiero meterme con formatos de audio pero todo esto tiene que ver con los códecs libres y esas cosas; el formato audio/webm funciona en los navegadores que probé y por eso se descarga con esa extensión.

Conclusión

Así podemos grabar un audio con JavaScript desde cualquier micrófono y descargar el archivo de la grabación. Funciona (lo he probado) en:

  • Firefox y Google Chrome en Windows 10
  • Firefox y Google Chrome en Android 9
  • No funciona en Edge sobre Windows 10 porque no está disponible MediaRecorder.

Recuerda que puedes ver la demostración en este enlace, y el código (ya que no puse el HTML) en mi GitHub.

Ah, cabe mencionar que getUserMedia funciona solo en localhost o en servidores https.


Estoy disponible para trabajar en tu proyecto o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.
Si el post fue de tu agrado muestra tu apoyo compartiéndolo, suscribiéndote al blog, siguiéndome o realizando una donación.

Suscribir por correo

Ingresa tu correo y recibirás mis últimas entradas sobre programación, open source, bases de datos y todo lo relacionado con informática

Únete a otros 4,207 suscriptores


parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

11 Comentarios

Leon · marzo 6, 2021 a las 11:39 pm

Buena info, gracias por el aporte. Quisiera consultar, cómo se hace para enviar audio por websocket con socket.io de nodeJs y recibirlo en otro cliente?

    Alejandro · febrero 17, 2022 a las 10:04 am

    Tuviste alguna solución que me puedas compartir?

ERNESTO · octubre 17, 2020 a las 12:16 am

Como se realizaria si la grabacion que obtengo quiero transcribirlo en un textarea en el html, que funciones mas debo agregar para convertir lo que grabo a texto? ,gracias

Luis · septiembre 28, 2020 a las 7:21 am

Me encanto tu post tengo una duda, como le haría para hacer lo mismo pero con una web cam, te explico ósea grabar el video junto con el audio y poder descargarlo de la misma manera que el audio?

Como podría detectar la resolución de la web cam?

Gracias!

Mauricio · julio 12, 2020 a las 1:40 am

Muy bueno el post. Me ha resultado de mucha ayuda. Gracias!

Adrian · enero 29, 2020 a las 6:40 am

Hola,

Muchísimas gracias por tu código. Sería muy bueno que completaras añadiendo como hacemos que se descargue en mp3. Gracias !

    parzibyte · enero 29, 2020 a las 11:24 am

    Gracias por sus comentarios. Le invito a seguirme y compartir.
    Sobre su consulta; al momento de escribir esto, es imposible descargarlo como mp3.
    Saludos 🙂

paul · septiembre 11, 2019 a las 1:58 pm

Hola, muchisimas gracias por tu aportación, te comento que soy nuevo en esto, quisiera saber si existe una forma de que se guarde el audio en alguna ruta del servidor, esto con la intención de que el usuario grabe un audio y al darle detener se guarde en el servidor y que posterior a ello pueda ser reproducido despues.

    parzibyte · septiembre 11, 2019 a las 2:06 pm

    Hola. Sí, puedes guardar el audio en el servidor, tengo un ejemplo con PHP: https://parzibyte.me/blog/2019/05/27/grabar-audio-microfono-javascript-php/
    En este caso simplemente debes cambiar la ruta en la variable $rutaDeGuardado y podrás guardar el audio en otro lugar
    Para reproducir el audio más tarde, puedes usar el elemento audio de HTML y poner la fuente como la ruta en donde se guardó en PHP
    Saludos

Deja un comentario

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada.

A %d blogueros les gusta esto: