欢迎大家转载,为保留作者成果,转载请注明出处,http://blog.csdn.net/netluoriver,有些文件在资源中也可以下载!如果你没有积分,可以联系我!
VAD静音抑制,又称语音活动侦测。静音抑制的目的是从声音信号流里识别和消除长时间的静音期,以达到在不降低业务质量的情况下节省话路资源的作用,它是IP电话应用的重要组成部分。静音抑制可以节省宝贵的带宽资源,可以有利于减少用户感觉到的端到端的时延。
根据上面的定义我们可以理解为,当进行语音通讯时,如果终端开启了静音检测功能,当用户在一段时间内没有讲话时,终端不会向外发送语音包或发送少量的包,节约带宽!
在测试之前我们先定义下测试场景
服务器是公网服务器,IP地址是218.249.39.212,其中终端1007使用的是联通上网卡,15623722867使用的是公司内部WIFI。
终端1007用的语音呼叫终端15623722867之前,我们用tcpcump在服务器端先进行抓包,然后再进行抓包。语音呼叫完毕后,停止抓包,然后从服务器中下载抓取的包,在windows中用wireshark或Hammer工具进行分析。
我们分别用不开启静音检测功能与开启静音检测功能的两个包为例来分析!两个包PTIME都为100,速率为4.75kbit/s,
jingyin_100_4.75.pcap开启了静音检测功能进抓的包;
null_jingyin.pcap没有开启静音检测功能时抓的包;
我们用wireshark打开开启静音检测后抓的包jingyin100_4.75.pcap为例来分析。
怎样在服务器中众多的SIP包中过滤出我们指定的SIP呼叫流与语音包呢?
根据SIP协议在呼叫过程中CALL-ID的唯一性,我们先把客户端主叫方1007 INVITE请求中的CALL-ID记录下来,通过在服务器方法如下
过滤的内容为“sip.Call-ID == "421943381468"”显示如下:
从Filter中再过滤SIP包,查找服务器给15623722867发送的INVITE请求。所以Source地址一定是服务器218.249.39.212,且请求行为INVITE的包。找到后用上面同样的方法把CALL-ID拷贝出来至记事本中,这次过滤服务器到15623722867的内容为“sip.Call-ID == "Anta1397122876180baaa61fd4c77752c15112@d427f9da"” 如下图:
我们获得的这两个CALL-ID其实就是此次呼叫的SIP流程。
我们在wireshark容器中输入这两个CALL-ID,过滤内容如下:
sip.Call-ID == "421943381468" || sip.Call-ID == "Anta1397122876180baaa61fd4c77752c15112@d427f9da" |
在wireshark中显示如下:
我们通过以下方法可以看一下它的呼叫流程图:
下图为上面直观的SIP呼叫流程图:
到目前为止,我们已经过滤出SIP呼叫的流程来了,下面我们需要过滤出呼叫的语音流。
首先我们先来了解下本次过滤信息SDP协议中的一些知识:
(SDP具体内容请参考:
http://wenku.baidu.com/view/92e3e71714791711cc7917f7.html)
通过上图信息及SIP消息流程,我们首先过滤下1007至服务器端的SIP呼叫,在wireshark容器中过滤CALL-ID,内容为:“sip.Call-ID == "421943381468"”,如图所示:
因1007是主叫,服务器中返回的200 OK的SDP中携带了服务器接收的媒体端口号,上图中端口12650即为服务器1007将语音媒体流发送给服务器的端口号,我们将此端口号记录在记事本中;
同样的,我们 过滤服务器至15623722867的SIP程,内容为sip.Call-ID == "Anta1397122876180baaa61fd4c77752c15112@d427f9da",这一次我们过滤的不是15623722867返回的200 OK,而是服务器发起的INVITE请求SDP中携带接收的媒体端口号,此次服务器在端口39510接收15623722867发来的语音媒体流,如下图所示:
至此,我们可以过滤出此次呼叫的SIP呼叫流程及RTP流。
在wireshark过滤信息内容为:
sip.Call-ID == "421943381468" || sip.Call-ID == "Anta1397122876180baaa61fd4c77752c15112@d427f9da" ||udp.dstport == 39510 ||udp.dstport ==12650 |
其实上面的内容只是显示整个呼叫过程中的SIP呼叫流程及RTP流。
由于两端都开启了静音检测功能,我们只需要分析一端的RTP流就可以了。
我们过滤15623722867至服务器端的媒体流为例。
在wireshark中过滤udp.dstport == 39510
然后我们进行分析,操作如下:
其中Delta(ms)代表此包与前一包的时间间隔,通过上图可以看出,静音检测功能生效了。最大间隔为718ms。我们设置的PTIME间隔为100ms,比实际延迟了618ms.
用同样的方法测试没有开启静音检测功能的终端,Delta最大值为123.18ms。比实际延迟了23.18ms.如下图。
通过以上进行分析,我们设置的PTIME为100ms,当启用了静音检测功能后,发送间隔最大会有618ms,这样在同样的单位时间内发送的包就会少一些,不启用静音检测功能时,最大延时只有23.18ms,通过对比发现静音检测功能生效了!