Javascript 以最小延迟解码来自Icecast的HTTP音频流

Javascript 以最小延迟解码来自Icecast的HTTP音频流,javascript,icecast,web-audio-api,internet-radio,whatwg-streams-api,Javascript,Icecast,Web Audio Api,Internet Radio,Whatwg Streams Api,我正在使用Icecast从内部麦克风传输实时音频,希望听者拥有尽可能小的延迟 简单地访问http://myhostname:8000/my_mountpoint获取流,但要解码(使用Web Audio API的解码音频数据),并通过将解码数据路由到音频上下文目标(内部扬声器)来播放数据块。这可以有效地降低延迟 问题:此streams API虽然是实验性的,但应该在最新的Chrome、Safari、Opera、FF上运行(设置特定标志后)。但是,除了Chrome和Opera之外,我在所有其他浏览器

我正在使用Icecast从内部麦克风传输实时音频,希望听者拥有尽可能小的延迟

简单地访问
http://myhostname:8000/my_mountpoint
获取流,但
要解码(使用Web Audio API的
解码音频数据
),并通过将解码数据路由到音频上下文目标(内部扬声器)来播放数据块。这可以有效地降低延迟

问题:此streams API虽然是实验性的,但应该在最新的Chrome、Safari、Opera、FF上运行(设置特定标志后)。但是,除了Chrome和Opera之外,我在所有其他浏览器中都遇到了
解码音频数据的问题。我相信FF和Safari无法解码部分MP3数据,因为我通常在开始播放流媒体时听到扬声器的短暂激活。在Safari上,成功的
decodeAudioData
上的回调永远不会被调用,FF只会说
EncodingError:不支持给定的编码。

如果我想至少让它在Safari和FF上工作,有什么解决办法吗?Chrome和Safari上的
decodeAudioData
实现是否真的不同,一个可以在部分MP3上工作,另一个不能?

如果需要亚秒延迟,请不要使用Icecast! 如果您需要低于10秒的延迟,并且无法完全控制整个软件链和网络,请不要使用Icecast! 是的,这是回答,不是评论。Icecast不是为此类用例而设计的。它设计用于以非同步方式通过HTTP进行数据的1对n批量广播

你所解释的听起来好像你真的应该考虑一些被设计成低延迟的东西,比如WEB RTC。 如果你认为你真的应该使用Icecast,请解释原因。因为你的问题正好相反。我完全支持更多的Icecast使用,毕竟我是它的维护者,但它的应用应该是有意义的

我正在使用Icecast从内部麦克风传输实时音频,希望听者拥有尽可能小的延迟

您的设置中存在一些问题,这些问题会妨碍尽可能低的延迟:

  • HTTP Progressive(Icecast和类似公司使用的流媒体类型)通过TCP(一种可靠的传输)运行。如果数据包丢失,则在将数据传输到浏览器之前,数据包重新传输到客户端时会有一段延迟时间。这样可以确保按顺序听到每一位音频,但可能会导致延迟。对于低延迟,通常使用UDP数据包,因此任何丢失的数据包都可以跳过而不是等待,从而导致故障,但客户端会降低延迟

  • MP3不是一个很好的低延迟编解码器。还有更好的编解码器,比如Opus,它们效率更高,可以生成更小的片段

  • 正如您所看到的,当通过HTTP进行流传输时,默认情况下客户端将缓冲更多的数据

然而,在理想的情况下,我已经通过HTTP Progressive在Chrome中使用定制服务器,延迟不到250毫秒。我敢打赌,如果关闭服务器端缓冲并使用不同的编解码器,Icecast也可以获得类似的性能

但是,除了Chrome和Opera之外,我在所有其他浏览器中都遇到了解码音频数据的问题。我相信FF和Safari无法解码部分MP3数据

是的,
decodeAudioData()
用于解码整个文件。您将很难以样本精确的方式解码任意分割的块

幸运的是,有一种方法可以做你想做的事。。。MediaSource扩展


基本上,您可以使用完全相同的ReadableStream接口,将数据推送到SourceBuffer,最终以正常的
标记播放。这确实适用于来自Icecast和类似服务器的普通MP3音频,前提是您已经解决了任何跨源问题。

正如@Brad提到的,Opus在低延迟方面非常出色。我编写了一个可用于流的低延迟WASM Opus解码器,并启动了另一个演示,演示如何使用
decodeAudioData()
播放部分文件:

  • 生产准备好了吗
  • 是一个非维护的POC演示,应该为您指明正确的方向

您需要多低的延迟?我正在构建一个1对n(其中n约为20)系统,类似于同声翻译系统(假设一个人对着发送设备说话,而访客通过接收设备收听,除了WiFi而不是收音机)。如果我使用VLC作为(接收)客户机并将其调整为尽可能少的缓冲区,我实际上已经设法获得了亚秒(大约半秒,对我来说完全可用)的延迟。因此,我认为问题更多地在于客户端,而不是Icecast。您可以获得相当低的延迟,但您必须非常严格地控制事情。Icecast不会增加太多开销,这是正确的,特别是当您关闭“连接时突发”时。它仍然不是HTTP/TCP流媒体设计所擅长的,正如Icecast中实现的那样。基于webRTC的音频会议解决方案在这方面可能要好得多。您好@TBR,谢谢您的两分钱。我想知道从哪里开始WebRTC。我发现了一个单向广播的例子:。。但问题是,我不能使用浏览器,因为我正在处理一个带有多个输入通道的USB音频接口,我认为Chromium浏览器(或任何浏览器)还不支持多通道音频输入。WebRTC在没有浏览器的情况下还能工作吗?我很确定服务器端缓冲不是问题,因为我也使用VLC作为客户端(而不是web),通过正确的设置可以将端到端延迟降低到亚秒级。我甚至将问题缩小到了一个x秒缓冲区,HTML音频标记在