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

标签 javascript node.js xmlhttprequest web-audio-api 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 来完成此操作还是需要通过套接字完成?

最佳答案

不幸的是,这在今天是不可能的。另请参阅:Fetch with ReadableStream as Request Body

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

浏览器中有关 Fetch 和 Streams 接口(interface)的规范规定应该可以使用流作为请求正文,但目前还没有浏览器实现它。

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

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

关于javascript - 如何将实时音频从浏览器流式传输到 Icecast 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50701071/

相关文章:

javascript - 无法在React中使用package.json "exports"导入模块

javascript - 如何导入与包含它们的文件夹同名的文件?

javascript - 创建新的 Mongodb 文档与推送到文档数组

javascript - jQuery Mobile 获取当前页面

Javascript/Jquery - 点击时增加 div 的填充百分比

javascript - 创建具有共享变量的对象

node.js - 如何从运行的应用程序中获取nodejs的源代码

ruby-on-rails - 从 Rails 3 中的 JSON 响应中获取数据

javascript - 如何在异步模式下使用 XMLHttpRequest 设置多个 header 数据?

javascript - 对当前 URL 的 XMLHttpRequest POST 请求的有效 URL 字符串