Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将实时音频从浏览器传输到Icecast服务器_Javascript_Node.js_Xmlhttprequest_Web Audio Api_Icecast - Fatal编程技术网

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

Javascript 如何将实时音频从浏览器传输到Icecast服务器,javascript,node.js,xmlhttprequest,web-audio-api,icecast,Javascript,Node.js,Xmlhttprequest,Web Audio Api,Icecast,是否有一种方法可以将实时音频输入从浏览器发送到Icecast服务器 我正在使用getUserMediaAPI来接收音频输入,我希望这是到Icecast服务器的实时流 getAudioInput(){ const constraints = { video: false, audio: {deviceId: this.state.deviceId ? {exact: this.state.deviceId} : undefined}, }; window.navi

是否有一种方法可以将实时音频输入从浏览器发送到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请求体。因此,您不能使用动态生成的数据执行长时间运行的HTTP PUT。在发送请求之前,必须完全解析请求正文

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

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


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

我认为没有从浏览器直接发送(作为源客户机)的方法。至少我没听说过有人能成功地做到这一点。通过一些调整,这很可能是可行的。@TBR但这可以在其他应用程序/软件中完成,对吗?你是说Javascript中的限制不允许流式传输到Icecast吗?我可能错了,但在这个Webcast客户端中似乎是有可能的:好吧,看起来有人通过使用websocket使它工作了(这在行为上与我们在Icecast中经常做的非常相似)@TBR Javascript有什么限制使得将实时音频流到Icecast服务器如此困难?我应该用什么语言构建一个客户机?什么特性使它更适合这份工作?我想可能是这样的。我将沿着这条路走下去websockets@Stretch0还考虑在他们的问题跟踪器中游说W3C和浏览器开发人员等等。我认为在浏览器中有一个合适的HTTP客户机对于许多用例来说都是很重要的,但可能从来没有人要求它,因为人们认为浏览器不能做这些有用的事情。因此,它似乎从来都不是优先事项。我们很快就能拥有这种能力了。无论如何,让我知道如果你有兴趣授权我的代码,这已经解决了你的需要。brad@audiopump.coAs您在链接到的帖子中提到,最好将缓冲区转换为int16缓冲区。我正在这样做,并向我的套接字服务器发送消息,该服务器只是将消息转发回客户端。我在这里详细解释了这一点,您也可以尝试webrtc api来帮助我们。浏览器可以分块发送内容吗?我在考虑像HLS这样的技术。