SIP DTMF
SIP通常有三種支持DTMF的方式。
一種是帶外(out of band),採用SIP的INFO消息。在這種情況下,DTMF數字如0,1,3等在SIP的INFO消息裏攜帶。
一種是帶內(in band),就是通過RTP中的Codec,例如G.711。SDP中Payload Type或者Codec的定義見RFC3551。
不是所有的Codec都能夠攜帶DTMF。比如G.729,因爲壓縮得厲害,就不能夠攜帶DTMF。所以RFC2833(注:RFC4733對RFC2833有更新)定義了一種專門的Payload Type來傳遞DTMF信號。從SIP的角度看RFC2833定義的方式也是屬於帶內,因爲它是在RTP流裏面傳而不是在信令裏面傳。但從RTP的角度看,他屬於一種特殊的Payload Type,這種類型定義爲“telephone-event”。RTP的角度看這種方式可能是帶外,因爲是在語音或視頻Codec之外傳DTMF。(Payload Type和Codec我認爲是等價的,一回事,不知對不對。)
RFC3551定義了96-127的Payload Type是Dynamic的。就是說這個範圍內的數字本身沒有定義Codec或Payload Type。
下面是截取的SIP消息中的SDP Body中的Payload Type部分。其中8和101代表的是兩種Payload Type。8是靜態的類型,代表”PCMA/8000”。101在96-127之間,是動態類型。需要直到後面的telephone-event才知道具體的Payload Type。
m=audio 2332 RTP/AVP 8 101
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
- 1
- 2
- 3
- 4
按慣例101代表telephone-event,但只是慣例,最初大概是因爲Cisco的設備用101代表telephone-event(見這裏)。如下面消息,把101換成96在邏輯上和上面的消息是等價的。
m=audio 2332 RTP/AVP 8 96
a=rtpmap:8 PCMA/8000
a=rtpmap:96 telephone-event/8000
a=fmtp:96 0-15
- 1
- 2
- 3
- 4
關於SIP的SDP Offer/Answer模型,參見RFC6337。在RFC4317中也有SIP的SDP Offer/Answer例子。