1. 程式人生 > >PCM、G.729等常用VoIP編碼的實際帶寬計算

PCM、G.729等常用VoIP編碼的實際帶寬計算

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編碼的實際帶寬計算