【发布时间】:2015-01-29 05:15:16
【问题描述】:
我目前正在寻找在用户录制时使用 Web Audio API/getUserMedia 的 onaudioprocess 块将音频录制“流式传输”到后端:
// (socket call to 'recordInit' called when record button is clicked
// not shown here)
node.onaudioprocess = function(e) {
[...]
socket.emit('recordStream', {
some_relevant_ids: '123abc',
pcm_data: convertFloat32ToInt16(e.inputBuffer.getChannelData(0))
})
}
我正在使用 socketio 发送到 nodejs/express 后端:
var wstream = null;
socket.on('recordInit', function(data) {
wstream = fs.createWriteStream(data.some_relevant_ids + '.pcm');
})
socket.on('recordStream', function(data) {
wstream.write(data.pcm_data);
})
socket.on('recordStop', function(data) {
// close the wstream, convert to mp3 using lame, send to CDN
})
当用户单击“停止录制”按钮时,我向后端发出“recordStop”请求,后端编译所有发送的 pcm 数据,将其转换为 MP3,并将完成的产品发送到 CDN。
通过使用文件句柄 (wstream) 作为全局变量,我已经让整个事情对单个用户正常工作,但我现在希望让这个工作对多个同时用户工作,所以我不能使用文件句柄的一个公共变量。我还担心对 recordStream 的套接字请求的顺序可能不正确,也许我需要发送时间戳(通过前端)并在最后根据时间戳对 recordStream 数据包进行排序。
TL;DR:我想知道:
- 最好的方法是什么(存储带有时间戳的 PCM 数据包并在最后一起编译)?我目前正在考虑在流式传输期间将其放入 Redis,然后根据时间戳在最后按顺序检索它。我不确定这对于 Redis 之类的东西是否是最佳做法。
- 我尝试根据我在每个请求中传入的“some_relevant_ids”名称在每个 recordStream 中打开一个新的 wstream 句柄。然而,虽然大量 PCM 数据被写入该文件,但在将其转换为 MP3 时,它并不是一个有效的音频文件。我不太确定为什么这不起作用。
如果有人对此有任何想法,请告诉我。谢谢!
【问题讨论】:
标签: redis socket.io web-audio-api getusermedia