我正在使用Icecast从内部麦克风流式传输实时音频,并希望听众尽可能减少延迟。
一个天真的解决方案是简单地访问http://myhostname:8000/my_mountpoint
来获取流,但<audio>
标签在播放之前执行内部缓冲并导致相当高的延迟。
当前解决方案:我使用ReadableStreams
API解码(使用Web Audio API的decodeAudioData
)并通过将解码数据路由到音频上下文目的地(内部扬声器)来播放数据块。这样可以显着降低延迟。
问题:这个流API虽然是实验性的,但应该在最新的Chrome,Safari,Opera,FF上设置technically work(在设置特定标志之后)。然而,除了Chrome和Opera之外,我在所有其他浏览器中遇到decodeAudioData
问题。我的信念是FF和Safari无法解码部分MP3数据,因为我开始流式传输时通常会听到扬声器的短暂激活。在Safari上,成功的decodeAudioData
的回调从未被调用,FF只是说EncodingError: The given encoding is not supported.
如果我想至少让它在Safari和FF上工作,是否有任何变通方法? decodeAudioData
的实现在Chrome和Safari上实际上是不同的,这样一个可以在部分MP3上运行而另一个不在吗?
正如@Brad所提到的,Opus非常适合低延迟。我写了一个可以与Streams一起使用的低延迟WASM Opus解码器,我开始了另一个演示如何使用decodeAudioData()
播放部分文件的演示:
是的,这是一个答案,而不是评论。 Icecast不适用于此类用例。它是为非同步方式通过HTTP进行1对n批量广播数据而设计的。
您解释的内容听起来像是您真的应该考虑设计为低延迟的内容,例如web-RTC。
如果你认为你真的应该使用Icecast,请解释原因。因为你的问题不然。我需要更多的Icecast使用,毕竟我是它的维护者,但它的应用应该是有意义的。
我正在使用Icecast从内部麦克风流式传输实时音频,并希望听众尽可能减少延迟。
您的设置存在一些问题,可能会阻止尽可能低的延迟:
但是,在理想的条件下,我使用自定义服务器在Chrome中以小于250毫秒的延迟流式传输HTTP Progressive。我敢打赌如果关闭服务器端缓冲并使用不同的编解码器,你可以从Icecast获得类似的性能。
然而,除了Chrome和Opera之外,我在所有其他浏览器中都遇到了decodeAudioData的问题。我的信念是FF和Safari无法解码部分MP3数据
是的,decodeAudioData()
用于解码整个文件。您将很难以样本精确的方式解码任意分段的块。
幸运的是,有一种方法可以做你想要的... MediaSource Extensions。
https://developer.mozilla.org/en-US/docs/Web/API/Media_Source_Extensions_API
基本上,您可以使用完全相同的ReadableStream接口并将数据推送到SourceBuffer,最终播放出正常的<audio>
标记。这适用于来自Icecast和类似服务器的普通MP3音频,只要您解决了任何跨源问题。