有没有办法可以将实时音频输入从浏览器发送到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
执行此操作,还是需要通过套接字执行此操作?
答案 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