簡體   English   中英

實時音頻對話iOS

[英]Real time audio conversation iOS

我正在為希望允許用戶之間實時(最小延遲,最長50毫秒)對話的客戶設計一個iOS應用程序(一種Teamspeak)。 滯后必須很低,因為音頻也可以是現場音樂,用樂器演奏,所以所有用戶都需要同步。 我需要一台服務器,它會向每個客戶端請求錄音並發送給其他人(並讓他們同時聽到相同的聲音)。 HTTP易於管理/實現且易於擴展,但性能非常低,因為平均HTTP請求需要> 50ms ...(使用中級硬件),所以我在考慮在客戶端之間保持打開的TCP / UDP連接和服務器。 但我有一些問題:

  • 如果我用Python開發服務器(例如使用TwistedMatrix),它的性能如何?
  • 我不能用C ++開發服務器,因為它很難管理(可擴展)和開發。
  • 任何人都使用Nodejs(易於擴展)來管理TCP / UDP連接?
  • 如果我使用HTTP,它是否足夠快與Keep-Alive? 因為通常執行HTTP請求所需的時間大於50毫秒(因為打開 - 關閉連接很難),並且我希望總程序小於該時間。
  • 服務器將在Linux機器上運行。

最后:你能建議我使用哪種壓縮方式? 我認為Ogg Vorbis會很好,但如果有更好的東西(並且可以在iOS中使用),我願意接受改變。

謝謝你,奧馬爾。

與服務器有什么關系,請求本身不是瓶頸。 我猜你有足夠的時間來建立連接,因為它只在會話開始時發生。 因此,該協議沒有多大意義。

但請考慮HTTP是無狀態協議,不適合音頻流。 您可以選擇幾種實時流媒體協議。 所有這些都可以通過TCP或UDP工作(例如使用原始套接字),並且有很多實現。

在您的情況下,延遲的瓶頸不是服務器而是網絡本身。 如果AP配置錯誤且連接良好,則iOS設備和無線接入點(AP)之間的連接會耗盡大約40毫秒。 (ping你的iPhone。)總的來說,路徑iOS - > AP - > Server - > AP - > iOS總共至少有80ms。 但是很難保持這種延遲穩定。 (我本地網絡上AirPlay的典型延遲時間約為300毫秒。)

我認為iOS設備上的現場音樂今天不可行。 嘗試兩個iOS設備之間的Skype,看看你有多接近50毫秒。 我敢打賭,沒有人可以做得更好,有什么關系延遲。

更新:新的研究成果!

我必須修改關於iDevice的wifi連接延遲的聲明。 顯然,當您第一次ping您的設備時,延遲會很糟糕。 但是如果我在不遲於200ms之后再次ping通,我會看到AP和iDevice之間的平均延遲為2ms-3ms。

我的解釋是,如果AP和iDevice之間沒有通信超過200ms,iDevice的網絡適配器將進入反應較慢的睡眠模式,可能是為了節省電池電量。

所以看來,現場音樂再次觸手可及...... :-)

更新2

保持低延遲所需的ping間隔顯然因設備而異。 報道的200毫秒是第三代。 iPad兼容。 對於我的iPhone 4,它更像是50ms。

雖然流媒體音頻你可能不需要為此煩惱,因為數據的交換頻率更高。 在我自己的上下文中,我在iDevice和服務器之間進行稀疏通信,但低延遲是至關重要的。 因此,保持活力是可行的方法。

最好,彼得

首先,您不會獲得低於50毫秒的延遲。 其他人試過這個。 例如,參見http://ejamming.com/這是一項試圖做你正在做的事情的服務,但是在線路上有一個音樂明顯的延遲,因此,在許多人看來,它完全無法使用。 他們使用特殊的路由技術來盡可能降低延遲,最后我聽說他們的服務不適用於某些路由器配置。

其次,你在服務器上使用的語言可能沒什么區別,因為從客戶端到服務器的延遲將比你的服務造成的任何延遲更糟,但如果我理解你的服務正確,你將需要大量的服務器(或服務器線程)只是在客戶端之間中繼音頻數據或進行某種最小程度的混合。 這是每個連接的少量工作,但是很多連接,所以你需要能夠處理它的東西。 我傾向於像Java,Scala或者Go這樣的東西。 我可能是錯的,但我認為這不是一個很好的節點用例,據我所知,它目前還不能很好地進行多線程處理。 另外,不要poo-poo C ++,可擴展服務已經構建了C ++。 您還可以使用C ++構建服務的中繼部分,其余部分也可以構建。

第三,在選擇壓縮格式時,如果計划使用UDP,則必須選擇能夠在丟包中幸存的格式,我認為UDP是唯一可行的方法。 我不認為vorbis能勝任這項任務,但我可能錯了。 在我的頭腦中,我不確定在iPhone上有什么作用並且是UDP友好的,但我確信有很多東西。 Speex就是一個例子,是開源的。 不確定延遲和質量是否滿足您的需求。

最后,說實話,我認為還有其他事情你應該再研究一下。 例如。 DNS通常在本地緩存,而不是每次http調用都檢查(盡管它可能取決於系統/庫。至少大多數系統在本地緩存dns)。 此外,沒有TCP / UDP這樣的協議。 有TCP / IP(有時稱為TCP)和UDP / IP(有時稱為UDP)。 你似乎把它們稱為兩者。 差異對於你正在做的事情非常重要。 例如,HTTP運行在TCP之上,而不是UDP,UDP被認為是“不可靠的”,但開銷較少,因此它對流式傳輸很有用。

編輯:speex

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM