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