DTMF 的三种模式(SIP INFO、RFC 2833、IN BAND)
DTMF(双音多频)的定义
由高频音和低频音的两个正弦波合成表示按键 “0~9”、“*”、“#”、“A”、“B”、“C”、“D”。
SIP 中检测 DTMF 数据的三种方法
SIP INFO
带外检测方式,通过 SIP 信令通道传输 DTMF 数据。没有统一的实现标准,目前以 Cisco SIP INFO 为标准,通过 SIP INFO 包中的 signal 字段识别 DTMF 按键。注意当 DTMF 为 “” 时不同的标准实现对应的 signal= 或 signal=10。SIP INFO 的好处就是不影响 RTP 数据包的传输,但可能会造成不同步。
RFC 2833
带内检测方式,通过 RTP 传输,由特殊的 rtpPayloadType 即 TelephoneEvent 来标示 RFC 2833 数据包。同一个 DTMF 按键通常会对应多个 RTP 包,这些 RTP 数据包的时间戳均相同,此可以作为识别同一个按键的判断依据,最后一包 RTP 数据包的 end 标志置 1 表示 DTMF 数据结束。另外,很多 SIP UA 包括 IAD 都提供 TelephoneEvent 的设置功能,如 3CX Phone、Billion-IAD、ZTE-IAD 等默认的 TelephoneEvent 都为 101,但可以人为修改,这时要求在进行 RFC 2833 DTMF 检测之前需事先获取 SDP 协商的 TelephoneEvent 参数。
IN BAND
带内检测方式,而且与普通的 RTP 语音包混在一起传送。在进行 IN BAND DTMF 检测时唯一的办法就是提取 RTP 数据包进行频谱分析,经过频谱分析得到高频和低频的频率,然后查表得到对应的按键,进行频谱分析的算法一般为 Goertzel,这种算法的实现也很简单,网上有很多可以下到,但建议采用定点算法,浮点算法效率很低。
在选择压缩比很高码率很低的 codec,比如 G.723.1 和 G.729A 等,建议不要使用 IN BAND 模式,因为 IN BAND DTMF 数据在进行复杂编解码后会产生失真,造成 DTMF 检测发生偏差或失败。
另外,还特别需要注意的一点就是很多 SIP UA 中 IN BAND 都是伴随着 RFC 2833 和 SIP INFO 同时发生的,这时需要区别对待,最好选择 RFC 2833 和 SIP INFO 作为主要检测方式。
Enjoy Reading This Article?
Here are some more articles you might like to read next: