有没有办法可以将实时音频输入从浏览器发送到 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/