Estoy usando la API de grabación de MediaStream para grabar audio en el navegador, así (cortesía https://github.com/bryanjenningz/record-audio ):
const recordAudio = () => new Promise(async resolve => { // This wants to be secure. It will throw unless served from https:// or localhost. const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); const mediaRecorder = new MediaRecorder(stream); let audioChunks = []; mediaRecorder.addEventListener('dataavailable', event => { audioChunks.push(event.data); console.log("Got audioChunk!!", event.data.size, event.data.type); // mediaRecorder.requestData() }); const start = () => { audioChunks = []; mediaRecorder.start(1000); // milliseconds per recorded chunk }; const stop = () => new Promise(resolve => { mediaRecorder.addEventListener('stop', () => { const audioBlob = new Blob(audioChunks, { type: 'audio/mpeg' }); const audioUrl = URL.createObjectURL(audioBlob); const audio = new Audio(audioUrl); const play = () => audio.play(); resolve({ audioChunks, audioBlob, audioUrl, play }); }); mediaRecorder.stop(); }); resolve({ start, stop }); });Me gustaría modificar este código para comenzar a transmitir a nodejs mientras aún está grabando. Entiendo que el encabezado no estará completo hasta que termine la grabación. Puedo dar cuenta de eso en nodejs, o tal vez pueda vivir con encabezados no válidos, porque de todos modos lo introduciré en ffmpeg en nodejs. ¿Cómo hago esto?
El truco es cuando inicia su grabadora, hágalo así : mediaRecorder.start(timeSlice) , donde timeSlice es la cantidad de milisegundos que el navegador espera antes de emitir un evento de datos dataavailable con una gota de datos.
Luego, en su controlador de eventos para dataavailable , llama al servidor:
mediaRecorder.addEventListener('dataavailable', event => { myHTTPLibrary.post(event.data); });Esa es la solución general. No es posible insertar un ejemplo aquí, porque un entorno limitado de código no puede pedirle que use su cámara web, pero he creado uno aquí . Simplemente envía sus datos a Request Bin , donde puede ver el flujo de datos.
Hay algunas otras cosas en las que deberá pensar si desea volver a unir el video o el audio. La publicación del blog toca eso.