DTMF定义:由高频音和低频音的两个正弦波合成表示数字按键(0~9 * # A B C D)。
VOIP中 检测DTMF通常有三种方法,sip info, inband, out band(rfc2833), 此外,在3gpp ims规范中 对dtmf的要求已经采用最新的rfc 4733 取代rfc 2833.
1. sip info
为带外检测方式,通过SIP信令通道传输DTMF数据。没有统一的实现标准,通过SIP INFO 方法 发送,包中的signal字段识别DTMF按键。注意当DTMF为“*”时不同的标准实现对应的signal=*或signal=10。SIP INFO的好处就是不影响RTP数据包的传输,但可能会造成不同步。
2.out band (rfc2833)
为带内检测方式,通过RTP传输,由特殊的rtp PayloadType即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. in band
为带内检测方式,而且与普通的RTP语音包混在一起传送。在进行INBAND DTMF检测时唯一的办法就是提取RTP数据包进行频谱分析,经过频谱分析得到高频和低频的频率,然后查表得到对应的按键,进行频谱分析的算法一般为Goertzel,这种算法的实现也很简单,网上有很多可以下到,但建议采用定点算法,浮点算法效率很低。
从使用情况看,一般使用rfc283 即out band 方式,一般软交换服务器这几种方式都支持,我所知道的asterisk 支持 sip info , rfc 2833及inband 方式,但是rfc2833 兼容性最好, 由于Ims 里对dtfm 这块采用了rfc 47233 而取代了rfc2833, 所以在ims客户端与软交换对接时可能存在兼容性问题。
本文转自einyboy博客园博客,原文链接:http://www.cnblogs.com/einyboy/archive/2012/11/20/2779922.html,如需转载请自行联系原作者。