【问题标题】:Streaming audio with getUserMedia, socketio, nodejs, redis使用 getUserMedia、socketio、nodejs、redis 流式传输音频
【发布时间】: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


    【解决方案1】:

    您可以在客户端找到我的.wav 实现对opus 数据包压缩并在服务器端.wav 返回here,您还可以选择以mp3wav 格式保存记录,但是当然,您需要在服务器中安装ffmpeg

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 2013-04-12
      • 2012-01-18
      • 1970-01-01
      • 2010-12-11
      • 2012-10-19
      相关资源
      最近更新 更多