轉自:http://blog.csdn.net/wangwenwen/article/details/8264925
1. DTMF原理
DTMF(Double Tone MulitiFrequency,雙音多頻)作為實現電話號碼快速可靠傳輸的一種技術,它具有很強的抗干擾能力和較高的傳輸速度,因此,可廣泛用於電話通信系統中。但絕大部分是用作電話的音頻撥號。另外,它也可以在數據通信系統中廣泛地用來實現各種數據流和語音等信息的遠程傳輸。
DTMF是用兩個特定的單音頻組合信號來代表數字信號以實現其功能的一種編碼技術。兩個單音頻的頻率不同,代表的數字或實現的功能也不同。這種電話機中通常有16個按鍵,其中有10個數字鍵0~9和6個功能鍵*、#、A、B、C、D。由於按照組合原理,一般應有8種不同的單音頻信號。因此可采用的頻率也有8種,故稱之為多頻,又因它采用從8種頻率中任意抽出2種進行組合來進行編碼,所以又稱之為“8中取2”的編碼技術。
根據CCITT的建議,國際上采用的多種頻率為697Hz、770Hz、852Hz、941Hz、1209Hz、1336Hz、1477Hz和1633Hz等8種。用這8種頻率可形成16種不同的組合,從而代表16種不同的數字或功能鍵,具體組合見表1。
表1 雙音多頻的組合功能
高頻群Hz 功能 低頻群Hz |
1209 |
1336 |
1477 |
1633 |
697 |
1 |
2 |
3 |
A |
770 |
4 |
5 |
6 |
B |
852 |
7 |
8 |
9 |
C |
941 |
* |
0 |
# |
D |
2. DTMF在VOIP中的解決方案
(http://blog.chinaunix.net/uid-27122534-id-3260925.html)
目前傳送DTMF信號普遍有三種方式:
用SIP信令的INFO方法攜帶DTMF信號。
為帶外檢測方式,通過SIP信令的INFO方法攜帶DTMF信號。沒有統一的實現標准,目前以Cisco SIPINFO為標准,通過SIPINFO包中的signal字段識別DTMF按鍵。注意當DTMF為“*”時不同的標准實現對應的signal=*或signal=10。SIPINFO的好處就是不影響RTP數據包的傳輸,但是因為SIP控制信令和媒體傳輸(RTP)是分開傳輸,很容易造成DTMF信號和媒體包不同步。
舉個例子,在Voice Mail應用中,用戶根據提示音輸入一個DTMF信號,隨后開始留言。Server是在接受到該DTMF信號后開始保存用戶的留言。然而由於DTMF信號是通過SIP信令來傳輸的,而媒體流是通過RTP來傳輸的,有可能用戶留言的RTP包先到,而該DTMF信號的INFO消息延遲,導致Server不保存用戶的語音留言直至接受到INFO消息。
B. 通過RTP的數據內容傳輸(Inband)
為帶內檢測方式, In Band是指直接將DTMF的音頻數字信號不經任何處理直接打成RTP包在IP網中傳輸。其中可能和用戶的語音媒體流混合在一起傳輸。程序要獲知哪個包有DTMF信號,是什么DTMF信號,必須提取RTP數據包進行頻譜分析,經過頻譜分析得到高頻和低頻的頻率,然后查表得到對應的按鍵。在選擇壓縮比很高碼率很低的codec,比如G.723.1和G.729A等。主要缺陷是由於網絡丟包的影響,有時會造成DTMF信號丟失,而且DTMF音混合在語音包中,容易產生偏差,造成信號失真。
C. 通過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參數。