使用getUserMedia,socketio,nodejs,redis流式传输音频

时间:2015-01-29 05:15:17

标签: redis socket.io web-audio getusermedia

我目前正在寻找使用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这样的东西是不是最好的做法。
  • 我尝试在每个recordStream中基于'some_relevant_ids'名称打开一个新的wstream句柄,我在每个请求中都传入了这个名称。然而,虽然许多PCM数据被写入文件,但在将其转换为MP3时,它不是有效的音频文件。我不确定为什么那不起作用。

如果有人对此有任何想法,请告诉我。谢谢!

1 个答案:

答案 0 :(得分:0)

您可以在客户端找到.wav到opus数据包压缩的实现,然后返回到服务器端here上的.wav,您可以选择在mp3中保存录制内容还有wav格式,但当然,您需要在服务器中安装ffmpeg