Как я могу объединить потоковое аудио?

#javascript #node.js #audio #webrtc #streaming

Вопрос:

У меня есть веб-приложение, которое записывает звук с микрофона пользователя. Он отправляет данные на сервер. Соответствующий код выглядит следующим образом:

 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
    })
  }
}
 

На стороне сервера (Express.js), я отправляю полученные данные всем заинтересованным клиентам по мере их поступления. Вот соответствующий код:

 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)
    }
  })
 

Проблема в том, что каждый фрагмент, который я получаю от клиента, представляется полным файлом WAV, и объединение таких файлов не работает. При попытке воспроизвести такой файл вы слышите только первый фрагмент.

Я часами искал информацию о том, как объединить входные файлы (или любой другой метод, который привел бы к потоку, который можно прослушивать). Похоже, что по этой теме очень мало информации.

Я , в частности, рассматривал ffmpeg , но, несмотря на его предполагаемую способность объединять файлы, он ожидает, что все файлы будут предоставлены в командной строке. Я получаю потоковые данные, поэтому я практически не могу заранее перечислять имена файлов; Мне пришлось бы отправлять несколько файлов stdin , но это не работает.

Может ли кто-нибудь указать мне правильное направление? Я бы подумал, что объединение аудиофайлов было бы обычной необходимостью, но я не могу найти никаких инструментов, которые могли бы это сделать, не зная заранее всех данных, подлежащих обработке. Или я лаю не на то дерево?