如何将实时音频从浏览器流式传输到Icecast服务器

时间:2018-06-05 13:16:25

标签: javascript node.js xmlhttprequest web-audio icecast

有没有办法可以将实时音频输入从浏览器发送到Icecast服务器?

我正在使用getUserMedia API来接收音频输入,我希望这是一个到Icecast服务器的实时流。

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

  window.navigator.getUserMedia(
    constraints, 
    this.streamAudio, 
    this.handleError
  );
}

在我的streamAudio函数中,我想将其传输到Icecast服务器。我可以使用某种xmlhttprequest执行此操作,还是需要通过套接字执行此操作?

1 个答案:

答案 0 :(得分:1)

不幸的是,今天这不可能直接实现。另见:Fetch with ReadableStream as Request Body

基本上,浏览器不允许使用可流式处理的HTTP请求体。因此,您不能使用动态生成的数据来执行长时间运行的HTTP PUT。在发送请求之前,必须完全解析请求正文。

Fetch和Streams接口在浏览器中的规范说明应该可以将流用作请求主体,但是今天没有浏览器实现它。

目前只有两种方法可以从浏览器中获取流。其中之一是使用Web套接字。这是最简单的方法,需要您处理媒体数据的编码(通常通过MediaRecorder API)。第二种方法是使用WebRTC。使用WebRTC,您可以直接使用其MediaStream处理(难以做服务器端),也可以使用其数据流。如果您只是将数据直接发送到服务器,那么使用数据流与Web套接字没有任何实际好处。

我过去使用WebSocket方法构建了基于Web的客户端。另见:https://stackoverflow.com/a/40073233/362536