可能通信背景的同学,一提到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*=96bit)

2. RTP承载在什么传输协议?

UDP(消息头格式定长8*=64bit)

3. 通过何种IP网络传输?

IPv4(消息头格式定长20*=160bit)//也可以是IPv6

4. 承载在什么物理网络上?

Ethernet II(消息头格式定长14*=112bit)

八、封装后一个包有多长?

以太网头 + IP头    + UDP头 + RTP头 + 语音数据  = 数据总长
112bit + 160bit + 64bit + 96bit + *8bit = 1712bit

九、封装后的1712bit的数据包一秒要发多少个?

打包周期是20ms,一秒要发1000ms/20ms=50个。

十、带宽出来了!

 bit/个 *  个/秒 =  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/个 *  个/秒 =  bit/秒 = 29.6 Kb/秒

5. 几句废话

G.729编码数据量是PCM的1/8!而且语音质量好!难道完爆PCM编码?想多了,这个编解码需要花费更多的CPU资源。

工作了这些年,越来越体会到,不存在完美的东西(方案,编程语言,算法。。。),只有指定条件下的相对合适的存在罢了。

理论计算结束了,实际所占带宽是多少呢?需要各种流量监控软件去统计和观察了。

PCM、G.729等常用VoIP编码的理论带宽计算的更多相关文章

  1. VoIP常见编码的带宽计算

    voip带宽计算VOIP计算方法与所选用的编码方法有关,而与哪个厂家的没有什么关系,公式如下: 带宽=包长度×每秒包数=包长度×(1/打包周期)=(Ethernet头+IP头+UDP头+RTP头+有效 ...

  2. Python常用字符编码(转)

    Python常用字符编码   字符编码的常用种类介绍 第一种:ASCII码 ASCII(American Standard Code for Information Interchange,美国信息交 ...

  3. gcc/g++ 命令的常用选项

    gcc/g++ 命令的常用选项使用g++编译CPP文件如果用gcc编译C++源文件时,加以下选项:-lstdc++,否则使用了C++操作的文件编译会出错.假如在程序中用到new delete操作,而不 ...

  4. Python 常用 PEP8 编码规范

    Python 常用 PEP8 编码规范 代码布局 缩进 每级缩进用4个空格. 括号中使用垂直隐式缩进或使用悬挂缩进. EXAMPLE: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  5. VOIP语音编码带宽计算

    VOIP Bandwidth consumption naturally depends on the codec used.  VOIP消耗的带宽一般取决于所使用的语音编码. When calcul ...

  6. 小白袍 -- Chapter 1.4.1.1 URL编码的理论解读

    1.4.1.1  URL编码的理论解读 我们在做JavaWeb时避不过GET请求,GET请求和POST请求最大一点不同就在于参数,GET请求的参数会URL中,而POST请求的参数则会在HTTP Hea ...

  7. Python常用字符编码

    字符编码的常用种类介绍 第一种:ASCII码 ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一 ...

  8. js keyCode 常用键盘编码

    摘自:http://blog.csdn.net/dyllove98/article/details/8728657 keycode 8 = BackSpace BackSpace keycode 9 ...

  9. HTML常用特殊字符编码对照表以及其对应英文

    符号 说明 对应编码(使用时去掉空格) 英文 & AND 符号 & amp; ampersand < 小于 & lt; little > 大于 & gt; ...

随机推荐

  1. android中使用Nine-Patch图片

    android中可以把图片进行处理,如果图片被拉伸的话,允许让图片部分区域不拉伸,部分区域拉伸.这个功能非常好,比如聊天的气泡,如果整个气泡被拉伸的话,会非常的丑. 老版的sdk中提供的有draw9p ...

  2. 转-为什么Lisp语言如此先进?(译文)

    之前在看黑客与画家的时候看过,今天重温,完全不一样的感觉! 原文地址:http://www.ruanyifeng.com/blog/2010/10/why_lisp_is_superior.html ...

  3. 【视频教学】如何利用高德地图IOS SDK进行开发?

    Step1:使用IOS SDK可以做什么高德地图 iOS SDK 是一套基于 iOS 5.1.1 及以上版本的地图应用程序开发接口.通过该接口,用户可使用高德地图数据和服务轻松构建功能丰富.交互性强的 ...

  4. Swift语言精要 - 浅谈代理模式(Delegate)

    在iOS编程中,我们经常谈到代理代理,也就是delegate,那么什么是代理呢? 我们来看一下cocoa对它的描述: Delegation is Cocoa’s term for passing of ...

  5. 转:NGNIX模块开发——nginx的配置系统

    From:http://tengine.taobao.org/book/chapter_02.html nginx的配置系统 nginx的配置系统由一个主配置文件和其他一些辅助的配置文件构成.这些配置 ...

  6. Shell编程初步

      一:Hello World 新建一个文件,命名时以 .sh 为后缀.每个bash文件开头第一行表名文件类型: #!/bin/bash 然后在下面输入代码. 比如输出hello world: #!/ ...

  7. Nginx server之Nginx添加ssl支持

    //环境介绍 1.nginx服务器:10.10.54.157 2.配置nginx服务器,当监听到来自客户端www.zijian.com:80请求时,转到10.10.54.150:1500这个web服务 ...

  8. SpringCloud stream连接RabbitMQ收发信息

    百度上查的大部分都是一些很简单的单消费者或者单生产者的例子,并且多是同一个服务器的配置,本文的例子为多服务器配置下的消费生产和消费者配置. 参考资料:https://docs.spring.io/sp ...

  9. docker容器日志在哪?以及清理命令

    /var/lib/docker/containers 日志大小限制:传送门 查看所有容器日志大小和清理所有容器日志命令: ls -lh $(find /var/lib/docker/container ...

  10. 【TP3.2.*】解决session过期不失效 和 设置不成功问题

    // ---------- 更新与 2019/01/23日 -------------// 1.问题:本来我想设置session有效期1800秒即30分钟 失效的,可是实际使用TP3.2.0的时候发现 ...