可能通訊背景的同窗,一提到PCM編碼,腦海裏都能跳出來一個數值64K。算法
1、64KB仍是64Kb?編程
64Kb!
2、哪裏來的64Kb?網絡
CCITT規定抽樣率爲每秒8000KHz,每抽樣值編8位碼,因此每秒共採集64Kbit數據。
3、PCMA和PCMU編程語言
就是對採集到的64Kbit按照不一樣的對數壓縮特徵(A率和μ率)進行編碼。
編碼後的數據大小仍然是64Kbit(所謂的無損編碼?)。
4、160字節是怎麼來的?編碼
常常聽過「每包數據長度是160字節」,哪裏來的?
上面已經知道,使用PCM編碼,每秒產生64000bit數據。
轉化成字節,就是64000bit/(8bit/字節)=8000字節。
好了,下面須要考慮怎麼把這8000字節數據發送出去了。spa
5、這每秒產生的8000字節數據你打算怎麼處理?code
你能夠選擇先什麼都不作,等一秒結束,編碼出全部的數據,而後把這一個包所有發出去,那這一個包就是8000字節。 你也能夠選擇,每等待100ms,編碼一次數據,而後把這一個包發送出去,那這一個包就是8000字節/(1000ms/100ms)=800字節。 你也能夠選擇,每等待10ms,編碼一次數據,而後把這一個包發送出去,那這一個包就是8000字節/(1000ms/10ms)=80字節。 你的等待時間就是打包週期,把一個週期的數據放到一個數據包裏就叫打包。
等等,說了半天仍是沒出現160字節。blog
6、160字節找出來了!資源
當打包週期是20ms的時候,一個包就是8000/(1000ms/20ms)=160字節。
這麼巧,20ms也是PCMA最經常使用的打包週期,G.729也是。
7、如何封裝這一包160字節?
1. 封裝在哪一種消息協議發送出去呢?it
RTP(消息頭格式定長12*8=96bit)
2. RTP承載在什麼傳輸協議?
UDP(消息頭格式定長8*8=64bit)
3. 經過何種IP網絡傳輸?
IPv4(消息頭格式定長20*8=160bit)//也能夠是IPv6
4. 承載在什麼物理網絡上?
Ethernet II(消息頭格式定長14*8=112bit)
8、封裝後一個包有多長?
以太網頭 + IP頭 + UDP頭 + RTP頭 + 語音數據 = 數據總長 112bit + 160bit + 64bit + 96bit + 160*8bit = 1712bit
9、封裝後的1712bit的數據包一秒要發多少個?
打包週期是20ms,一秒要發1000ms/20ms=50個。
10、帶寬出來了!
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資源。
工做了這些年,愈來愈體會到,不存在完美的東西(方案,編程語言,算法。。。),只有指定條件下的相對合適的存在罷了。
理論計算結束了,實際所佔帶寬是多少呢?須要各類流量監控軟件去統計和觀察了。