一、RFC2833
1. 介紹:
RFC2833為帶內檢測方式,通過RTP傳輸,由特殊的rtpPayloadType即TeleponeEvent來標示RFC2833數據包。同一個DTMF按鍵通常會對應多個RTP包,這些RTP數據包的時間戳均相同,此可以作為識別同一個按鍵的判斷依據,最后一包RTP數據包的end標志置1表示DTMF數據結束。
另外,很多SIP UA默認的TeleponeEvent都為101,但可以人為修改,這時要求在進行RFC2833 DTMF檢測之前需事先獲取SDP協商的TeleponeEvent參數。
2. 配置:
這是FreeSWITCH默認的DTMF檢測配置。
二、SIPINFO
1. 介紹:
SIPINFO為帶外檢測方式,通過SIP信令通道傳輸DTMF數據。這種方式甚至比RFC2833更有效。但是由於SIP信令和RTP收發采用的是不同的端口,所以可能會造成收到DTMF和實際的聲音不同步。
2. 配置:
修改profile,例如sip_profiles/internal.xml。
<param name="dtmf-type" value="info"/>
三、INBAND
1. 介紹:
INBAND為帶內檢測方式,而且與普通的RTP語音包混在一起傳送。在進行INBAND DTMF檢測時唯一的辦法就是提取RTP數據包進行頻譜分析,經過頻譜分析得到高頻和低頻的頻率,然后查表得到對應的按鍵,進行頻譜分析的算法一般為Goertzel,這種算法的實現也很簡單,網上有很多可以下到,但建議采用定點算法,浮點算法效率很低。
2. 配置:
2.1 修改profile,例如sip_profiles/internal.xml。
<param name="dtmf-type" value="inband"/>
2.2 在需要使用的dialplan中增加
<action name="start_dtmf"/>
附錄
DTMF
全稱:Dual Tone Multi Frequency(雙音多頻)
定義:由高頻音和低頻音的兩個正弦波合成表示數字按鍵(0~9 * # A B C D)