关于sip软电话dtmf的实现

    这段时间,正在做视频会议系统,客户端得自己做,服务器选用的是asterisk。选它很无奈,虽然asterisk对视频会议的支持很有限,仅支持video swtiching,但又一时写不出好的服务器端,只好选用它了。

    asterisk对video switch的支持,使我这个迷路的小孩,高兴坏了,但仔细一看,要想实现video switch ,还需要使客户端支持VAD或者DTMF。VAD 就是voice activity detection ,就是在你不说话时,停止发rtp音频包;而DTMF 就是人们所说的 双音多频信号,就像电话的按键一样,这样,我就不得不为我的客户端增加DTMF了,

 

DTMF(双音多频)定义:由高频音和低频音的两个正弦波合成表示数字按键(0~9 * # A B C D)

SIP中检测DTMF数据的方法:SIPINFORFC2833INBAND

      1SIPINFO

     为带外检测方式,通过SIP信令通道传输DTMF数据。没有统一的实现标准,目前以Cisco SIPINFO为标准,通过SIPINFO包中的signal字段识别DTMF按键。注意当DTMF为“*”时不同的标准实现对应的signal=*signal=10SIPINFO的好处就是不影响RTP数据包的传输,但可能会造成不同步。

      2RFC2833

      为带内检测方式,通过RTP传输,由特殊的rtpPayloadTypeTeleponeEvent来标示RFC2833数据包。同一个DTMF按键通常会对应多个RTP包,这些RTP数据包的时间戳均相同,此可以作为识别同一个按键的判断依据,最后一包RTP数据包的end标志置1表示DTMF数据结束。另外,很多SIP UA 包括IAD都提供TeleponeEvent的设置功能如3CX PhoneBillion-IADZTE-IAD等默认的TeleponeEvent都为101,但可以人为修改,这时要求在进行RFC2833 DTMF检测之前需事先获取SDP协商的TeleponeEvent参数。

      3INBAND

      为带内检测方式,而且与普通的RTP语音包混在一起传送。在进行INBAND DTMF检测时唯一的办法就是提取RTP数据包进行频谱分析,经过频谱分析得到高频和低频的频率,然后查表得到对应的按键,进行频谱分析的算法一般为Goertzel,这种算法的实现也很简单,网上有很多可以下到,但建议采用定点算法,浮点算法效率很低。

     在选择压缩比很高码率很低的codec,比如G.723.1G.729A等,建议不要使用INBAND模式,因为INBAND DTMF数据在进行复杂编解码后会产生失真,造成DTMF检测发生偏差或失败。

另外,还特别需要注意的一点就是很多SIP UAINBAND都是伴随着RFC2833SIPINFO同时发生的,这时需要区别对待,最好选择RFC2833SIPINFO

 在用sip info传输DTMF信号的时候要注意的问题:

  1. Content-Type: application/dtmf-relay
    Message Body:
    Signal=5/r/n
    Duration=160/r/n
  2. 发送一次INFO方法CSeq要增加一次

  以下是一段SIP INFO方法的实现代码:

   char size[16];
   int len = strlen(body);
   osip_message_t* info = NULL; 
   eXosip_lock();
   eXosip_call_build_info(did, &info);
   sprintf(size, "%d", len);
   osip_message_set_content_length(info, size);
   osip_message_set_content_type(info, "application/dtmf-relay");
   osip_message_set_body(info, body, len);
   eXosip_call_send_request(did, info);
   eXosip_unlock();

以上有些东西是从别人那摘抄来的.就说到这里了

你可能感兴趣的:(关于sip软电话dtmf的实现)