2015-05-28 89 views
1

我曾希望建立一個應用程序,將音頻(mp3,ogg等)從我的麥克風傳輸到網絡瀏覽器。如何設置實時音頻流http服務器?

我想我可以使用html5音頻標籤從我的服務器讀取/播放流。

我真的堅持的地方是如何設置流HTTP端點。我需要哪些技術,以及我的服務器應該如何構造以從我的麥克風獲取實時音頻並從我的服務器訪問?

例如,對於流式傳輸mp3,我是否經常用錄製的MP3幀進行響應?

感謝您的幫助!

回答

2

首先,讓我們把這個問題分成幾個部分。您有音頻捕獲(錄製),編碼/編解碼器,服務器和接收客戶端。

Capture -> Codec -> Server -> Several Clients 

對於音頻捕獲,您將需要使用Web Audio API along with getUserMedia。這將允許您從記錄設備獲取32位浮點PCM採樣。這個數據流佔用了大量的帶寬......幾兆比特的立體聲流。此流不能直接在HTML5音頻標籤中播放,儘管您可以使用Web Audio API在接收端播放,但它佔用了過多的帶寬,無法使用。您需要使用編解碼器來降低帶寬使用率。

您要查看的編解碼器包括MP3,AAC(及其變體,如HE-AAC)和Opus。並非所有瀏覽器都支持所有編解碼器。 MP3是最廣泛兼容的,但AAC在給定的比特率下提供更好的質量。 Opus是一個免費的開放式編解碼器,但仍然沒有最好的客戶端採用。無論如何,還沒有一種編解碼器可以在任何真正的穩定性中在瀏覽器中運行。 (雖然它正在開發中!Emscripten有很多測試項目。)我通過將樣本的位深度降低爲16位有符號整數並將此PCM流發送到服務器來完成編解碼器來解決此問題,通過二進制websocket。

此編碼服務器將PCM流並通過編解碼器服務器端運行。在這裏你可以使用任何你想要的東西,比如許可的編解碼器二進制文件或者封裝多個編解碼器的FFmpeg之類的工具。

接下來,該服務器將數據流式傳輸到真正的流媒體服務器,如Icecast。 SHOUTcast和Icecast服務器採用編碼流並通過類似HTTP的連接將其中繼給許多客戶端。 (Icecast符合HTTP,而SHOUTcast很接近但不是那裏可能導致兼容性問題。)

一旦你設置了流媒體服務器,就像在你的<audio>標記中引用流URL一樣簡單。

希望能讓你開始。根據您的需要,您可能還會考慮WebRTC,它爲您完成所有這些工作,但不會爲您提供質量選項,也不會擴展到少數用戶。