以前有一個實習生問我,說他作了一個語音通話的功能,可是爲何傳過來的聲音幾乎不能聽。爲何會這樣呢?若是用的是tcp傳輸應該是不會丟的,可是若是是UDP傳輸的話,那麼丟的機率就比較大了。丟包只是一方面大緣由,其實還有另外一個緣由那就是因爲網絡的延遲,擁堵而致使的播放亂序。你們知道網絡的傳輸是無序的,那麼頗有可能一包數據到達的很晚,一包會較早的到達。因此對於網絡傳輸語音須要一個抖動緩衝區對網絡發送語音進行必定的策略才能再轉給上層播放。那抖動緩衝區的原理是什麼呢?web
抖動緩衝區就是將接收到的語音先存到一個buffer裏面,根據當前網絡的延遲時間以及當前上層獲取的時間對數據進行選取。使用抖動緩衝是以延遲爲代價的,從而保證語音的流暢。首先會計算當前網絡的延遲,能夠根據網絡延遲的大小設定變化的buffer的大小,可是buffer也能夠是不變的,這要看怎麼設計了。當上層來取數據的時候根據當前網絡的延遲時間取當前時間減去網絡延遲時間的數據包,這個時間並不必定這樣嚴格,能夠有必定的幅度。比較有名的開源項目:doubango,webrtc都實現了這樣的功能。網絡