我們已經在Silverlight上實現了一個音頻 - 視頻協作應用程序,並試圖調整它。我們遇到的一個問題是,丟包時流延遲會增加:我們必須等待丟包被檢測,請求,然後再丟失丟包。當然,這與我們的音頻流的一致性發揮地獄。 (如果可以的話,我們會切換到UDP,但是Silverlight不支持瀏覽器中的內容,我們也禁用了Nagle算法,所以一般來說,只要我們提交一個要傳輸的byte []數組,我知道TCP數據包的大小!=提交的數據量,但是在Nagle算法關閉的情況下,它是接近的,而且我們有一個自適應抖動緩衝區,所以我們可以用處理丟失數據包,但TCP/IP上丟失的數據包大大增加了我們需要緩衝的音頻數量,從而大大增加了延遲。)什麼是最大限度地減少丟失數據包對通過TCP發送的實時媒體流的影響的最佳方式?
因此,我們試圖優化我們發送數據包的方式,以查看是否有任何方法減少丟包的影響。我們目前有幾個競爭的解決方案,我們正在考慮實施:
(1)我們可以嘗試使我們的數據包更大。目前,我們通過同一個TCP流發送大量(〜1024字節視頻)數據包和小型(〜70字節音頻)數據包。但是我們可以將音頻和視頻數據複用在一起,也就是說,只要有空間,我們就可以將一些視頻數據附加到我們的音頻數據包中。這將使單個數據包稍大,但會減少數據包的總數。 (2)我們可以將音頻和視頻分成兩個獨立的TCP流。這意味着如果視頻流由於丟失數據包而停滯,則音頻流不會停頓,反之亦然。當然,這會稍微增加開銷,並且不會減少發送的數據包總數。 (3)我們可以將音頻反向複用爲多個單獨的TCP流,然後在遠端重新組裝它們。這將有效地允許我們「僞造」單個UDP數據包傳輸方式。如果我們有8個音頻流,並且其中一個音頻流由於丟失了數據包而停止工作,其他數據流仍然能夠按時發送數據,我們所要做的就是處理音頻數據包的1/8直到停滯的河流恢復正常爲止。這當然並不理想,但它可能會導致更好的體驗,而不是讓整個流停頓,並且不能播放任何數據包,直到丟失的數據包被重新傳輸。
對這些可能性有任何想法嗎?還有其他建議嗎?或者我們只需要編碼所有三個,然後測試它們?
MTU將影響選項1 - 它僅與客戶端和服務器之間的最小MTU速度相同 – 2010-11-19 22:13:06
同意 - 我們不能使數據包太大。目前我們的有效負載限制在1024字節,但我相信我們可能會達到1500字節,而不會遇到MTU問題。 – 2010-11-19 22:25:34