PCM、G.729等常用VoIP編碼的實際帶寬計算
阿新 • • 發佈:2018-03-02
cit ipv6 cci 所有 需要 結束 blog 什麽 編碼算法
我覺得通信背景的同學,一提到PCM編碼,腦海裏都能跳出來一個數值64k。
一、64KB還是64Kb?
64Kb!
二、哪裏來的64Kb?
CCITT規定抽樣率為每秒8000KHz,每抽樣值編8位碼,所以每秒共采集64Kbit數據。
三、PCMA和PCMU
就是對采集到的64Kbit按照不同的對數壓縮特征(A率和μ率)進行編碼。
編碼後的數據大小仍然是64Kbit(所謂的無損編碼?)。
四、160字節是怎麽來的?
經常聽過“每包數據長度是160字節”,哪裏來的?
上面已經知道,使用PCM編碼,每秒產生64000bit數據。
轉化成字節,就是64000bit/(8bit/字節)=8000字節。
好了,下面需要考慮怎麽把這8000字節數據發送出去了。
五、這每秒產生的8000字節數據你打算怎麽處理?
你可以選擇先什麽都不做,等一秒結束,編碼出所有的數據,然後把這一個包全部發出去,那這一個包就是8000字節。 你也可以選擇,每等待100ms,編碼一次數據,然後把這一個包發送出去,那這一個包就是8000字節/(1000ms/100ms)=800字節。 你也可以選擇,每等待10ms,編碼一次數據,然後把這一個包發送出去,那這一個包就是8000字節/(1000ms/10ms)=80字節。 你的等待時間就是打包周期,把一個周期的數據放到一個數據包裏就叫打包。
等等,說了半天還是沒出現160字節。
六、160字節找出來了!
當打包周期是20ms的時候,一個包就是8000/(1000ms/20ms)=160字節。 這麽巧,20ms也是PCMA最常用的打包周期,G.729也是。
七、如何封裝這一包160字節?
1. 封裝在哪種消息協議發送出去呢?
RTP(消息頭格式定長12*8=96bit)
2. RTP承載在什麽傳輸協議?
UDP(消息頭格式定長8*8=64bit)
3. 通過何種IP網絡傳輸?
IPv4(消息頭格式定長20*8=160bit)//也可以是IPv6
4. 承載在什麽物理網絡上?
Ethernet II(消息頭格式定長14*8=112bit)
八、封裝後一個包有多長?
以太網頭 + IP頭 + UDP頭 + RTP頭 + 語音數據 = 數據總長 112bit + 160bit + 64bit + 96bit + 160*8bit = 1712bit
九、封裝後的1712bit的數據包一秒要發多少個?
打包周期是20ms,一秒要發1000ms/20ms=50個。
十、帶寬出來了!
1712 bit/個 * 50 個/秒 = 85600 bit/秒 = 85.6 Kb/秒
附錄、G.729的帶寬呢?
1. 這個編碼算法厲害了,每秒只產生8000bit語音數據。
2. 通常的打包周期也是20ms,每個包的語音數據是8000bit/(1000ms/20ms)=160bit。
3. 一個包長
以太網頭 + IP頭 + UDP頭 + RTP頭 + 語音數據 = 數據總長
112bit + 160bit + 64bit + 96bit + 160bit = 592bit
4. 所需帶寬
592bit/個 * 50 個/秒 = 29600 bit/秒 = 29.6 Kb/秒
5. 幾句廢話
G.729編碼數據量是PCM的1/8!而且語音質量好!難道完爆PCM編碼?想多了,這個編解碼需要花費更多的CPU資源。
工作了這些年,越來越體會到,不存在完美的東西,只有指定條件下的相對合適的存在罷了。
理論計算結束了,實際所占帶寬是多少呢?需要各種流量監控軟件去統計和觀察了。
PCM、G.729等常用VoIP編碼的實際帶寬計算