一、DTMF(双音多频)定义:由高频音和低频音的两个正弦波合成表示数字按键(0~9 * # A B C D)。
二、SIP中检测DTMF数据的方法:SIPINFO、RFC283三、INBAND
1)SIPINFO
为带外检测方式,经过SIP信令通道传输DTMF数据。没有统一的实现标准,目前以Cisco SIPINFO为标准,经过SIPINFO包中的signal字段识别DTMF按键。注意当DTMF为“*”时不一样的标准实现对应的signal=*或signal=10。SIPINFO的好处就是不影响RTP数据包的传输,但可能会形成不一样步。
2)RFC2833
为带内检测方式,经过RTP传输,由特殊的rtpPayloadType即TeleponeEvent来标示RFC2833数据包。同一个DTMF按键一般会对应多个RTP包,这些RTP数据包的时间戳均相同,此能够做为识别同一个按键的判断依据,最后一包RTP数据包的end标志置1表示DTMF数据结束。另外,不少SIP UA 包括IAD都提供TeleponeEvent的设置功能如3CX Phone,Billion-IAD,ZTE-IAD等默认的TeleponeEvent都为101,但能够人为修改,这时要求在进行RFC2833 DTMF检测以前需事先获取SDP协商的TeleponeEvent参数。
3)INBAND
为带内检测方式,并且与普通的RTP语音包混在一块儿传送。在进行INBAND DTMF检测时惟一的办法就是提取RTP数据包进行频谱分析,通过频谱分析获得高频和低频的频率,而后查表获得对应的按键,进行频谱分析的算法通常为Goertzel,这种算法的实现也很简单,网上有不少能够下到,但建议采用定点算法,浮点算法效率很低。
在选择压缩比很高码率很低的codec,好比G.723.1和G.729A等,建议不要使用INBAND模式,由于INBAND DTMF数据在进行复杂编解码后会产生失真,形成DTMF检测发生误差或失败。
另外,还特别须要注意的一点就是不少SIP UA中INBAND都是伴随着RFC2833和SIPINFO同时发生的,这时须要区别对待,最好选择RFC2833和SIPINFO
原文:http://sirrain.blog.51cto.com/2645762/481055算法