Recibo audio en un navegador de WebRTC como MediaStream. Necesito convertirlo a un archivo de audio, preferiblemente un ogg. Idealmente, el archivo de audio se cargará en el servidor, pero descargarlo al cliente como un archivo es la segunda mejor opción.
Aprendí a cargar audio en blobs, por lo que si hay una manera de guardarlo primero en un blob, eso debería ser suficiente.
No puede convertir una transmisión directamente sobre la marcha en un archivo o blob, ya que MediaStream es una fuente de datos ilimitada sin un inicio ni un final fijos, incluso si "simplemente" transmite un archivo desde el otro lado de su conexión. Un blob/archivo, por otro lado, tiene un inicio y un final fijos. Para la conversión, debe definir un inicio y un final en algún lugar .
Dependiendo de sus necesidades, existen innumerables opciones sobre cómo establecer realmente los límites de inicio y finalización, pero realmente depende de sus necesidades cuál usar (por ejemplo, presionar un botón, evento final de las pistas de transmisión, evento del servidor, ...) .
Como señaló @Kaiido, puede usar MediaRecorder para convertir partes de un MediaStream en Blob. Los blobs se pueden convertir a archivo:
let recordedData = []; const mediaRecorder = new MediaRecorder( yourIncomingStream, {mimeType: "audio/ogg"}); mediaRecorder.ondataavailable = (event) => { /* add the data to the recordedDataArray */ recordedData.push(event.data) } /* this defines the start point - call when you want to start your audio to blob conversion */ function start() { mediaRecorder.start(); } /* this defines the end of your file, whenever called, a new file is created from the recorded data */ function createFileFormCurrentRecordedData() { const blob = new Blob(recordedData , {type: "audio/ogg"}); const file = new File( [ blob ], "yourfilename.ogg", { type: "audio/ogg"} ); /* then upload oder directly download your file / blob depending on your needs */ } /* stop the recording */ function stop() { mediaRecorder.stop(); } /* if you don't need multiple recordings, you can listen to onstop */ mediaRecorder.onstop = createFileFormCurrentRecordedData;