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

How to stream live audio from browser to Icecast server

有没有办法可以将实时音频输入从浏览器发送到 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 来做到这一点还是需要通过套接字来完成?

不幸的是,这在今天是不可能直接实现的。另见:

基本上,浏览器不允许可流式传输的 HTTP 请求正文。因此,您不能对动态生成的数据执行 long-运行 HTTP PUT。在发送请求之前必须完全解析请求正文。

浏览器中有关 Fetch 和 Streams 接口的规范指出,应该可以将流用作请求主体,但目前还没有浏览器实现它。

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

我过去构建过使用 WebSocket 方法的基于 Web 的客户端。另见: