如何使用Javascript创建实时媒体流

如何使用Javascript创建实时媒体流,javascript,node.js,web-audio-api,Javascript,Node.js,Web Audio Api,我想创建一个从一个设备到一个节点服务器的实时音频流,然后可以将该实时提要广播到几个前端 我已经广泛地搜索过了,真的遇到了麻烦,希望有人能帮上忙 我可以从window.navigator.getUserMediaAPI获取音频输入 getAudioInput(){ const constraints = { video: false, audio: {deviceId: this.state.deviceId ? {exact: this.state.deviceId} :

我想创建一个从一个设备到一个节点服务器的实时音频流,然后可以将该实时提要广播到几个前端

我已经广泛地搜索过了,真的遇到了麻烦,希望有人能帮上忙

我可以从
window.navigator.getUserMedia
API获取音频输入

getAudioInput(){
  const constraints = { 
    video: false, 
    audio: {deviceId: this.state.deviceId ? {exact: this.state.deviceId} : undefined},
  };

  window.navigator.getUserMedia(
    constraints, 
    this.initializeRecorder, 
    this.handleError
  );
}
然后将流传递给
initializeRecorder
函数,该函数使用
AudioContext
API创建createMediaStreamSource`

initializeRecorder = (stream) => {
  const audioContext = window.AudioContext;
  const context = new audioContext();
  const audioInput = context.createMediaStreamSource(stream);
  const bufferSize = 2048;
  // create a javascript node
  const recorder = context.createScriptProcessor(bufferSize, 1, 1);
  // specify the processing function
  recorder.onaudioprocess = this.recorderProcess;
  // connect stream to our recorder
  audioInput.connect(recorder);
  // connect our recorder to the previous destination
  recorder.connect(context.destination);
}
在我的
recorderProcess
函数中,我现在有一个
AudioProcessingEvent
对象,我可以流式处理它

目前,我通过套接字连接以流的形式发送音频事件,如下所示:

recorderProcess = (e) => {
  const left = e.inputBuffer.getChannelData(0);
  this.socket.emit('stream', this.convertFloat32ToInt16(left))
}
这是最好的方法还是唯一的方法?是否有更好的方法使用
fs.createReadStream
然后通过Axios发布端点?据我所知,这只适用于文件,而不是连续的实时流

服务器

我有一个运行在express上的非常简单的套接字服务器。当前,我侦听流事件,然后将相同的输入发送回:

io.on('connection', (client) => {

  client.on('stream', (stream) => {
    client.emit('stream', stream)
  });

});
不确定这是如何扩展,但如果你有更好的建议,我非常愿意接受

客户端

这就是我真正被困的地方:

在我的客户端上,我正在侦听
事件,并希望在浏览器中以音频输出的形式侦听流。我有一个接收事件的函数,但我无法确定如何使用返回的arrayBuffer对象

retrieveAudioStream = () => {
  this.socket.on('stream', (buffer) => {
     // ... how can I listen to the buffer as audio
  })
}
  • 我上传音频的方式是上传到节点服务器的最佳/唯一方式吗
  • 如何侦听在客户端返回的arrayBuffer对象
  • 我上传音频的方式是上传到节点服务器的最佳/唯一方式吗
  • 这并不是最好的,但我看到了更糟的情况,这不是使用WebSocket的唯一方法。从观点上看,这被认为是可行的,因为您希望事情“实时”,而不是每5秒发送一次http post请求

  • 如何侦听在客户端返回的arrayBuffer对象
  • 你可以试着听数据流,这个例子很简单


    根据您提供的代码片段,我假设您希望从头开始构建一些东西,以了解如何工作

    在这种情况下,您可以尝试使用websocket服务器,该服务器将块发送到X客户机,以便他们可以复制音频,等等

    这将是有意义的投资时间,学习如何流从客户端到另一个客户端

    还可以查看下面的链接以获取一些有用的信息


    你是说WebRTC是更好的选择吗?我避免使用WebRTC,因为据我所知,客户端流必须上载到每个连接的用户,这将导致上载者的带宽问题。我们还希望通过一个服务器,这样我们就可以跟踪所有的上传者。我不一定要从头开始构建一些东西。我很乐意使用现有的图书馆,但我很难找到任何适合我需要的。你有什么建议吗?听起来像是
    BaseAudioContext。decodeAudioData
    是我需要的,以便能够监听传入的音频流。我已经尝试过好几次让它与我的arrayBuffer块的传入流一起工作,但是不断地在要求使用
    音频缓冲区时出错。您知道如何获取
    BaseAudioContext.decodeAudioData
    以使用我的设置,还是需要更改上传音频流的方式?MDN给出的示例非常简单,介绍了如何收听,录制需要媒体录制器API,但由于处于实验状态,您可以使用库,如
    MediaStreamRecorder
    ,您可以将音频和流缓冲区捕获到服务器,然后服务器只向客户端发送缓冲区,而无需其他操作。