Tengo una aplicación web que graba audio desde el micrófono del usuario. Envía los datos al servidor. El código relevante se ve así:
class Recorder { // ... setRecorder() { this.recorder = new RecordRTC(this.stream, { type: 'audio', mimeType: this.mimeType, recorderType: StereoAudioRecorder, timeSlice: 2000, // Interval to send recorded data ondataavailable: async blob => { // send the data to the server let seq = this.seq++ let data = await blob.arrayBuffer() if(this.socket.connected) { try { this.socket.emit('audio', { id: this.id, seq, mimeType: this.mimeType, data }) } catch (e) { console.error('caught an error', e) this.stopRecording() } } }, sampleRate: 44100, desiredSampleRate: 44100, numberOfAudioChannels: 1 }) } }Del lado del servidor (Express.js), envío los datos tal como los recibo a cualquier cliente interesado. Aquí está el código relevante:
app.get('/play', (req, res, next) => { try { let id = req.query.id let mimeType if(!recordings[id]) { // ... } emitter // the EventEmitter that's handling this .on(`audio ${id}`, data => { if(!mimeType) { mimeType = data.mimeType res.writeHead(200, {'Content-Type': mimeType}) } res.write(data.data) }) .on(`close ${id}`, () => { console.debug({type:'audio close', id}) res.end() }) } catch (e) { next(e) } })El problema es que cada fragmento que obtengo del cliente parece ser un archivo WAV completo, y la concatenación de dichos archivos no funciona. Al intentar reproducir un archivo de este tipo, solo escucha el primer fragmento.
He estado buscando durante horas información sobre cómo concatenar los archivos de entrada (o cualquier otro método que dé como resultado una transmisión que se pueda escuchar). Parece que hay muy poca información sobre este tema.
He estado mirando en particular a ffmpeg , pero a pesar de su supuesta capacidad para concatenar archivos, espera que todos los archivos se proporcionen en la línea de comandos. Estoy recibiendo transmisión de datos, por lo que prácticamente no puedo enumerar los nombres de los archivos por adelantado; Tendría que enviar varios archivos en stdin , pero eso no funciona.
¿Alguien puede señalarme en la dirección correcta? Pensaría que concatenar archivos de audio sería una necesidad común, pero no puedo encontrar ninguna herramienta que sea capaz de hacerlo sin conocer de antemano todos los datos que se procesarán. ¿O estoy ladrando al árbol equivocado aquí?