VOIP语音抓包、解码与带宽计算

笔记最近接触到几种局域网的VOIP设备,Voice over Internet Protocol,决定对它内部通信研究一番,到底语音数据是怎么格式实时传输到对端。按照百度的解释,VoIP的基本原理是通过语音的压缩算法对语音数据编码进行压缩处理,然后把这些语音数据按 TCP/IP 标准进行打包,经过 IP 网络把数据包送至接收地,再把这些语音数据包串起来,经过解压处理后,恢复成原来的语音信号,从而达到由互联网传送语音的目的。

    理论简单明了,为了深入了解机理,笔记在交换机抓包来看看数据包到时是啥样的。

1、端口镜像

    图1,华为交换机配置监听端口,observe-port 1 interface GigabitEthernet0/0/1。

    图2,将端口456的输入输出流镜像到监听端口1上。port-mirroring to observe-port 1,命令行配置时在端口下输入这个命令就可以,它自动会展开为inbound和outbound两条。

    说来惭愧,笔记以前用wincap.dll编程抓包或wireshark抓包时,天真的以为交换机上面的数据是透传的,就是所有端口的数据都是一样。到抓包voip数据包时,sip和rtp包都没有抓到,只有拔掉网线,才会出现rtp包,但里面没有数据,是空包。后来才知道是端口镜像的问题,拔掉网线找不到目的端口地址,才会收到几个广播出来的RTP。

    2、电话rtp协议

    rtp协议内部的payload就是电话语音载荷数据,共80个字节,整个rtp包有134个字节,压缩编码格式Payload type: ITU-T G.711 PCMA (8),即G711A。头部就是数据链路层的物理地址,网络层的IP地址,UDP协议,数据在从上层向下层传送的过程中完成数据封装。其实我们只需要关注SRC.IP和DST.IP,还有一个参数Sequence number: 48971,在语音对外传输时发送了两份相同Sequence number的数据,但是解码时我们只需要一份就足够了,大概是UDP协议的不可靠因素,厂家在设计产品时时发送两份数据。

3、电台rtp协议

    VHF rtp协议和电话类似,payload就是电台语音载荷数据,共160个字节,整个rtp包有222个字节。为啥打包字节数不一样呢。采样率是8K,vhf是20ms周期,也就是160个样本。电话是10ms周期,80个样本。头部信息方面,vhf rtp头部多8个字节,包含电台的一些ptt sql等信息。

4、G771A编码

   pcm编码方式-G711a具体怎样编码请参看这个文章。笔记理解就是音频采集是16bit数据,取高13位,低位丢弃,这样数值变化不大,然后将高13位按照算法压缩到8位。压缩率为1:2, 即把16位数据压缩成8位便于传输。按照8k的采样率,也就是64k的数据载荷,不包括封装的头部。解码过程就是将8位恢复成13位,低位补零。笔记按照算法将一段G711A语音经过C语言解码成16bit pcm数据,然后调用DLL进行播放,能听清音乐,但是发现杂音很大。楼下是C语言代码,请不吝赐教,怎样优化解码,消除杂音。

5、传输带宽

电台voip和电话voip需要传输,按照上面的抓包,怎么确定传输带宽呢?采样率8k,传输语音载荷要8k*8bit=64kbits。那加上头部呢?

电台20ms周期:包222字节,载荷160字节。62*8/20+64=88.8k或者64*(222/160)=88.8k

电台10ms周期:头部长度不变,包142字节,载荷80字节,。113.6k。

电    话10ms周期:包134字节,载荷80字节。算一算,107.2k。

电    话20ms周期:包214字节,载荷160字节。85.6k。

为啥周期越短,带宽需要越大呢?哈哈哈,64k不变,要多传头部呗。



作者:刘小白DOER
链接:https://www.jianshu.com/p/8647db3ac1c3
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值