[英]Decoding HTTP Audio Stream from Icecast with minimal latency
我正在使用 Icecast 從內部麥克風流式傳輸實時音頻,並希望聽眾的延遲盡可能小。
一個簡單的解決方案是簡單地訪問http://myhostname:8000/my_mountpoint
來獲取流,但<audio>
標簽在播放之前會進行內部緩沖並導致相當高的延遲。
當前解決方案:我使用ReadableStreams
API進行解碼(使用 Web Audio API 的decodeAudioData
)並通過將解碼數據路由到音頻上下文目標(內部揚聲器)來播放數據塊。 這有效並顯着降低了延遲。
問題:這個流 API 雖然是實驗性的,但技術上應該適用於最新的 Chrome、Safari、Opera、FF(在設置特定標志之后)。 但是,我在除 Chrome 和 Opera 之外的所有其他瀏覽器中都遇到了decodeAudioData
問題。 我認為 FF 和 Safari 無法解碼部分 MP3 數據,因為當我開始流式傳輸時,我通常會聽到揚聲器的短暫激活。 在 Safari 上,從未調用成功的decodeAudioData
回調,FF 只是說EncodingError: The given encoding is not supported.
如果我想讓它至少在 Safari 和 FF 上工作,是否有任何解決方法? Chrome 和 Safari 上的decodeAudioData
實現實際上是否不同,以至於一個適用於部分 MP3 而另一個則不適用?
是的,這是一個答案,而不是評論。 Icecast 並非為此類用例而設計。 它旨在以非同步方式通過 HTTP 進行 1 對 n 批量數據廣播。
您所解釋的內容聽起來您確實應該考慮設計為低延遲的東西,例如 web-RTC。
如果您認為您確實應該使用 Icecast,請解釋原因。 因為你的問題不一樣。 我完全贊成更多的 Icecast 使用,畢竟我是它的維護者,但它的應用應該是有意義的。
我正在使用 Icecast 從內部麥克風流式傳輸實時音頻,並希望聽眾的延遲盡可能小。
您的設置存在一些問題會阻止盡可能低的延遲:
HTTP Progressive(Icecast 等使用的流媒體類型)在 TCP 上運行,這是一種可靠的傳輸方式。 如果數據包丟失,則在將數據傳送到瀏覽器之前,將其重新傳輸到客戶端時會存在一些延遲時間。 這可確保按順序聽到每一位音頻,但可能會導致延遲。 對於低延遲,通常使用 UDP 數據包,以便可以跳過任何丟失的數據包而不是等待,從而導致故障,但客戶端保持低延遲。
MP3 不是一個很好的低延遲編解碼器。 有更好的編解碼器,例如 Opus,它們效率更高,可以生成更小的片段。
如您所見,當通過 HTTP 流式傳輸時,客戶端默認會緩沖更多。
但是,在理想條件下,我使用自定義服務器在 Chrome 中以小於 250 毫秒的延遲通過 HTTP Progressive 進行流式傳輸。 我敢打賭,如果您關閉服務器端緩沖並使用不同的編解碼器,您可以從 Icecast 中獲得類似的性能。
但是,我在除 Chrome 和 Opera 之外的所有其他瀏覽器中都遇到了 decodeAudioData 問題。 我的信念是 FF 和 Safari 無法解碼部分 MP3 數據
是的, decodeAudioData()
用於解碼整個文件。 您將很難以樣本准確的方式解碼任意分段的塊。
幸運的是,有一種方法可以做您想做的事... MediaSource 擴展。
https://developer.mozilla.org/en-US/docs/Web/API/Media_Source_Extensions_API
基本上,您可以使用完全相同的 ReadableStream 接口並將數據推送到 SourceBuffer 以最終播放正常的<audio>
標簽。 這確實適用於來自 Icecast 和類似服務器的普通 MP3 音頻,前提是您已經解決了任何跨域問題。
正如@Brad 提到的,Opus 非常適合低延遲。 我編寫了一個可以與 Streams 一起使用的低延遲 WASM Opus 解碼器,並且我開始了另一個演示,演示如何使用decodeAudioData()
播放部分文件:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.