一、SDP協議介紹
SDP 完全是一種會話描述格式 ― 它不屬於傳輸協議 ― 它只使用不同的適當的傳輸協議,包括會話通知協議(SAP)、會話初始協議(SIP)、實時流協議(RTSP)、MIME 擴展協議的電子郵件以及超文本傳輸協議(HTTP)。SDP協議是也是基於文本的協議,這樣就能保證協議的可擴展性比較強,這樣就使其具有廣泛的應用范圍。SDP 不支持會話內容或媒體編碼的協商,所以在流媒體中只用來描述媒體信息。媒體協商這一塊要用RTSP來實現.
二、SDP協議格式
SDP描述由許多文本行組成,文本行的格式為<類型>=<值>,<類型>是一個字母,<值>是結構化的文本串,其格式依<類型>而定。
<type>=<value>[CRLF]
常見的fields有:
三、SDP協議例子:
下面是一個helix 流媒體服務器的RTSP協議中的SDP協議:
v=0 //SDP version
// o field定義的源的一些信息。其格式為:o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
o=- 1271659412 1271659412 IN IP4 10.56.136.37 s=<No title>
i=<No author> <No copyright> //session的信息
c=IN IP4 0.0.0.0 //connect 的信息,分別描述了:網絡協議,地址的類型,連接地址。
c=IN IP4 0.0.0.0
t=0 0 //時間信息,分別表示開始的時間和結束的時間,一般在流媒體的直播的時移中見的比較多。
a=SdpplinVersion:1610641560 //描述性的信息
a=StreamCount:integer;2 //用來描述媒體流的信息,表示有兩個媒體流。integer表示信息的格式為整數。
a=control:*
a=DefaultLicenseValue:integer;0 //License信息
a=FileType:string;"MPEG4" ////用來描述媒體流的信息說明當前協商的文件是mpeg4格式的文件
a=LicenseKey:string;"license.Summary.Datatypes.RealMPEG4.Enabled"
a=range:npt=0-72.080000 //用來表示媒體流的長度
m=audio 0 RTP/AVP 96 //做為媒體描述信息的重要組成部分描述了媒體信息的詳細內容:表示session的audio是通過RTP來格式傳送的,其payload值為96傳送的端口還沒有定。
b=as:24 //audio 的bitrate
b=RR:1800
b=RS:600
a=control:streamid=1 //通過媒體流1來發送音頻
a=range:npt=0-72.080000 //說明媒體流的長度。
a=length:npt=72.080000
a=rtpmap:96 MPEG4-GENERIC/32000/2 //rtpmap的信息,表示音頻為AAC的其sample為32000
a=fmtp:96 profile-level-id=15;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1210 //config為AAC的詳細格式信息
a=mimetype:string;"audio/MPEG4-GENERIC"
a=Helix-Adaptation-Support:1
a=AvgBitRate:integer;48000
a=HasOutOfOrderTS:integer;1
a=MaxBitRate:integer;48000
a=Preroll:integer;1000
a=OpaqueData:buffer;"A4CAgCIAAAAEgICAFEAVABgAAAC7gAAAu4AFgICAAhKIBoCAgAEC"
a=StreamName:string;"Audio Track"
下面是video的信息基本和audio的信息相對稱,這里就不再說了。
m=video 0 RTP/AVP 97
b=as:150
b=RR:11250
b=RS:3750
a=control:streamid=2
a=range:npt=0-72.080000
a=length:npt=72.080000
a=rtpmap:97 MP4V-ES/2500
a=fmtp:97 profile-level-id=1;
a=mimetype:string;"video/MP4V-ES"
a=Helix-Adaptation-Support:1
a=AvgBitRate:integer;300000
a=HasOutOfOrderTS:integer;1
a=Height:integer;240 //影片的長度
a=MaxBitRate:integer;300000
a=MaxPacketSize:integer;1400
a=Preroll:integer;1000
a=Width:integer;320 //影片的寬度
a=OpaqueData:buffer;"AzcAAB8ELyARAbd0AAST4AAEk+AFIAAAAbDzAAABtQ7gQMDPAAABAAAAASAAhED6KFAg8KIfBgEC"
a=StreamName:string;"Video Track"
SDP協議學習筆記
在SIP協議的包含的內容是SDP時,應該把Content-Type設置成application/sdp。
SDP:Session Description Protocol
SDP格式:
Session description
v= (protocol version)
o= (owner/creator and session identifier)
s= (session name)
i=* (session information)
u=* (URI of description)
e=* (email address)
p=* (phone number)
c=* (connection information - not required if included in all media)
b=* (zero or more bandwidth information lines)
One or more time descriptions ("t=" and "r=" lines, see below)
z=* (time zone adjustments)
k=* (encryption key)
a=* (zero or more session attribute lines)
Zero or more media descriptions
Time description
t= (time the session is active)
r=* (zero or more repeat times)
Media description, if present
m= (media name and transport address)
i=* (media title)
c=* (connection information - optional if included at
session-level)
b=* (zero or more bandwidth information lines)
k=* (encryption key)
a=* (zero or more media attribute lines)
以上帶"*"號的是可選的,其余的是必須的。一般順序也按照上面的順序來排列。
a=*是sdp協議擴展屬性定義,除上面以外的,分解時其它的都可以扔掉。
a=charset屬性指定協議使用的字符集。一般的是ISO-10646。
示例:
v=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
其中:nettype是IN,代表internet,addrtype是IP4或IP6。unicast-address任務創建計算機的地址。
整個這個屬性,是唯一表示一個任務。
e=123@126.com 或 p=+1 616 555-6011
對於一個任務只能兩者之中的一個,表示會議控制者的聯系方式。郵件地址可以是[email]j.doe@example.com[/email] (Jane Doe)形式,括號里面的是描述聯系人的名稱,或者Jane Doe <[email]j.doe@example.com[/email]>,前面的是聯系人的名稱。
c=<nettype> <addrtype> <connection-address>
這個連接數據,可以是傳話級別的連接數據,或者是單獨一個媒體數據的連接數據。在是多播時,connection-address就該是一個多播組地址,當是單播時,connection-address就該是一個單播地址。對於addrtype是IP4的情況下,connection-address不僅包含IP地址,並且還要包含a time to live value(TTL 0-255),如:c=IN IP4 224.2.36.42/128,IP6沒有這個TTL值。還允許象這樣的<base multicast address>[/<ttl>]/<number of addresses>格式的connection-address。如:c=IN IP4 224.2.1.1/127/3等同於包含c=IN IP4 224.2.1.1/127, c=IN IP4 224.2.1.2/127, c=IN IP4 224.2.1.3/127三行內容。
b=<bwtype>:<bandwidth> bwtype可以是CT或AS,CT方式是設置整個會議的帶寬,AS是設置單個會話的帶寬。缺省帶寬是千比特每秒。
t=<start-time> <stop-time>,這個可以有行,指定多個不規則時間段,如果是規則的時間段,則r=屬性可以使用。start-time和stop- time都遵從NTP(Network Time Protocol),是以秒為單位,自從1900以來的時間。要轉換為UNIX時間,減去2208988800。如果stop-time設置為0,則會話沒有時間限制。如果start-time也設置為0,則會話被認為是永久的。
r=<repeat-interval> <active duration> <offsets from start-time>重復次數在時間表示里面可以如下表示:
d - days (86400 seconds)
h - hours (3600 seconds)
m - minutes (60 seconds)
s - seconds (allowed for completeness)
z=<adjustment time> <offset> <adjustment time> <offset> ....
k=<method>
k=<method>:<encryption key>
a=<attribute>
a=<attribute>:<value>
m=<media> <port> <proto> <fmt> ...
m=<media> <port>/<number of ports> <proto> <fmt> ...
其中:<media>可以是,"audio","video", "text", "application" and "message"。<port>是媒體傳送的端口號,它依賴於c=和<proto>。<proto> 可以是,udp,RTP/AVP和RTP/SAVP。
a=cat:<category>分類,根據分類接收者隔離相應的會話
a=keywds:<keywords>關鍵字,根據關鍵字隔離相應的會話
a=tool:<name and version of tool>創建任務描述的工具的名稱及版本號
a=ptime:<packet time>在一個包里面的以毫秒為單位的媒體長度
a=maxptime:<maximum packet time>以毫秒為單位,能夠壓縮進一個包的媒體量。
a=rtpmap:<payload type> <encoding name>/<clock rate> [/<encoding parameters>]
a=recvonly
a=sendrecv
a=sendonly
a=inactive,
a=orient:<orientation>其可能的值,"portrait", "landscape" and "seascape" 。
a=type:<conference type>,建議值是,"broadcast", "meeting", "moderated", "test" and "H332"。
a=charset:<character set>
a=sdplang:<language tag>指定會話或者是媒體級別使用的語言
a=framerate:<frame rate>設置最大視頻幀速率
a=quality:<quality>值是0-10
a=fmtp:<format> <format specific parameters>
在SIP協議的包含的內容是SDP時,應該把Content-Type設置成application/sdp。
SDP(Session Description Protocol)模型介紹
如果有哪里描述有誤,或不准確,歡迎各位網友指正,可以及時討論並修正。
情態動詞術語解釋:
"MUST",必須、一定要;
"MUST NOT",禁止;
"REQUIRED",需要;
"SHALL"、"SHOULD",應該;
"SHALL NOT"、"SHOULD NOT",不應該;
"RECOMMENDED",推薦;
"MAY",可以
以上情態動詞術語可參考RFC2119[3],這些動詞要求我們在產品實現時,需要遵守或靈活變更約束。
術語
媒體流(Media Stream),或稱為媒體類型(Media Type),即我們通常所說的音頻流、視頻流等,所有通信實體要進行媒體交互之前都必須進行媒體注的協商
媒體格式(Media Format),每種媒體流都有不同的編碼格式,像音頻有G711、G712編碼,視頻有H261、H264等,像現在所謂的高清視頻采用是720P、1070P等。
單一會話(Unitcast Session)
多會話(Multicast Sessions)
單一媒體流(Unitcast Streams)
多媒體流(Multicast Streams)
SDP(Session Description Protocol)
SDP(會話描述協議),用於兩個會話實體之間的媒體協商,並達成一致,屬信令語言族,采用文本(字符)描述形式。rfc3264協議[1]主要概述一個請求/響應模型(offer/answer,以下敘述采用英文),包括請求/響應的實體和不同階段的操作行為,如初始協商過程和重協商過程,並簡單介紹消息中各種參數的含義。具體各個參數的詳細說明見rfc2327協議[2]。本文主要參照3264協議,大部分為直譯,附加自己經驗和理解。
圖1 SDP模型組網圖
1實體、消息
Offer/Answer模型包括兩個實體,一個是請求主體Offerer,另外一個是響應實體Answerer,兩個實體只是在邏輯上進行區分,在一定條件可以轉換。例如,手機A發起媒體協商請求,那么A就是Offerer,反之如果A為接收請求則為Offerer。
Offerer發給Answerer的請求消息稱為請求offer,內容包括媒體流類型、各個媒體流使用的編碼集,以及將要用於接收媒體流的IP和端口。
Answerer收到offer之后,回復給Offerer的消息稱為響應,內容包括要使用的媒體編碼,是否接收該媒體流以及告訴Offerer其用於接收媒體流的IP和端口。
2 SDP各個參數簡單介紹
下面示例摘自3264協議[1]
v=0
o=carol 28908764872 28908764872 IN IP4 100.3.6.6 //會話ID號和版本
s=- //用於傳遞會話主題
t=0 0 //會話時間,一般由其它信令消息控制,因此填0
c=IN IP4 192.0.2.4 //描述本端將用於傳輸媒體流的IP
m=audio 0 RTP/AVP 0 1 3 //媒體類型 端口號 本端媒體使用的編碼標識(Payload)集
a=rtpmap:0 PCMU/8000 //rtpmap映射表,各種編碼詳細描述參數,包括使用帶寬(bandwidth)
a=rtpmap:1 1016/8000
a=rtpmap:3 GSM/8000
a=sendonly //說明本端媒體流的方向,取值包括sendonly/recvonly/sendrecv/inactive
a=ptime:20 //說明媒體流打包時長
m=video 0 RTP/AVP 31 34
a=rtpmap:31 H261/90000
a=rtpmap:34 H263/90000
3 實體行為、操作過程
3.1 初始協商的Offer請求
實體A <-> 實體B,實體首先發起Offer請求,內容如2節所示,對於作何一個媒體流/媒體通道,這時實體A必須:
a. 如果媒體流方向標為recvonly/sendrecv,即a=recvonly或a=sendrecv,則A必須(MUST)准備好在這個IP和端口上接收實體B發來的媒體流;
b. 如果媒體流方向標為sendonly/inactive,即a=recvonly或a=sendrecv,則A不需要進行准備。
3.2 Answer響應
實體B收到A的請求offer后,根據自身支持的媒體類型和編碼策略,回復響應。
a. 如果實體B回復的響應中的媒體流數量和順序必須(MUST)和請求offer一致,以便實體A進行甄別和決策。即m行的數量和順序必須一致,B不能(MUST NOT)擅自增加或刪除媒體流。如果B不支持某個媒體流,可以在對應的端口置0,但不能不帶這個m行描述。
b. 對於某種媒體,實體B必須(MUST)從請求offer中選出A支持且自己也支持的該媒體的編碼標識集,並且可以(MAY)附帶自己支持的其它類型編碼。
c. 對於響應消息中各個媒體的方向:
如果請求某媒體流的方向為sendonly,那么響應中對應媒體的方向必須為recvonly;
如果請求某媒體流的方向為recvonly,那么響應中對應媒體的方向必須為sendonly;
如果請求某媒體流的方向為sendrecv,那么響應中對應媒體的方向可以為sendrecv/sendonly/recvonly/inactive中的一種;
如果請求某媒體流的方向為inactive,那么響應中對應媒體的方向必須為inactive;
d. 響應answer里提供IP和端口,指示Offerer本端期望用於接收媒體流的IP和端口,一旦響應發出之后,Offerer必須(MUST)准備好在這個IP和端口上接收實體A發來的媒體流。
e. 如果請求offer中帶了ptime(媒體流打包間隔)的a行或帶寬的a行,則響應answer也應該(SHOULD)相應的攜帶。
f. 實體B Offerer應該(SHOULD)使用實體A比較期望的編碼生成媒體流發送。一般來說對於m行,如m=video 0 RTP/AVP 31 34,排充越靠前的編碼表示該實體越希望以這個編碼作為載體,這里示例31(H261),34(H263)中H261為A更期望使用的編碼類型。同理,當實體A收到響應answer后也是這樣理解的。
3.3 實體收到響應后的處理
當實體A收到B回復的響應后,可以(MAY)開始發送媒體流,如果媒體流方向為sendonly/sendrecv,
a. 必須(MUST)使用answer列舉的媒體類型/編碼生成媒體發送;
b. 應該(SHOULD)使用answer中的ptime和bandwidth來打包發送媒體流;
c. 可以(MAY)立即停止監聽端口,該端口為offer支持answer不支持的媒體所使用的端口。
4 修改媒體流(會話)
修改媒體流的offer-answer操作必須基於之前協商的媒體形式(音頻、視頻等),不能(MUST NOT)對已有媒體流進行刪減。
4.1 刪除媒體流
如果實體認定新的會話不支持之前媒商的某個媒體,新的offer只須對這種媒體所在m行的端口置0,但不能不描述這種媒體,即不帶對應m行。當answerer收到響應之后,處理同初始協商一樣。
4.2 增加媒體流
如果實體打算新增媒體流,在offer里只須加上描述即可或者占用之前端口被置0的媒體流,即用新的媒體描述m行替換舊的。當answerer收到offer請求后,發現有新增媒體描述,或者過於端口被置0的媒體行被新的媒體描述替換,即知道當前為新增媒體流,處理同初始協商。
4.3 修改媒體流
修改媒體注主要是針對初始協商結果,如果有變更即進入修改流程處理,可能的變更包括IP地址、端口,媒體格式(編碼),媒體類型(音、視頻),媒體屬性(ptime,bandwidth,媒體流方向變更等)。
參考文檔
[1] RFC3264,An Offer/Answer Model with the Session Description Protocol (SDP)
[2] RFC2327,SDP: Session Description Protocol
[3] RFC2119,Key words for use in RFCs to Indicate Requirement Levels
SDP: Session Description Protocol(會話描述協議)
(RFC2327)
1. 概述
SDP也是MMUSIC工作組的一個產品,在MBONE內容中用得很多。其目的就是在媒體會話中,傳遞媒體流信息,允許會話描述的接收者去參與會話。 SDP基本上在internet上工作。他定義了繪畫描述的統一格式,但並不定義多播地址的分配和SDP消息的傳輸,也不支持媒體編碼方案的協商,這些功能均由下層傳送協議完成.典型的會話傳送協議包括:SAP(Session Announcement Protocol 會話公告協議),SIP,RTSP,HTTP,和使用MIME的E-Mail.(注意:對SAP只能包含一個會話描述,其它會話傳誦協議的SDP可包含多個繪畫描述)
SDP包括以下一些方面:
1) 會話的名稱和目的
2) 會話存活時間
3) 包含在會話中的媒體信息,包括:
媒體類型(video, audio, etc)
傳輸協議(RTP/UDP/IP, H.320, etc)
媒體格式(H.261 video, MPEG video, etc)
多播或遠端(單播)地址和端口
4) 為接收媒體而需的信息(addresses, ports, formats and so on)
5) 使用的帶寬信息
6) 可信賴的接洽信息(Contact information)
2. 協議
Session description //格式及舉例
v= (protocol version) //v=0
o= (owner/creator and session identifier). //o=<用戶名><會話id><版本><網絡類
//型><地址類型><地址>
//o=sname 1234567890 0987654321 IN
//IP4 126.15.64.3
s= (session name) //會話名
i=* (session information) //會話信息
u=* (URI of description) //u=http://www.zte.com.cn/staff/sdp.ps
e=* (email address) //e=zte@isi.edu(general text如:王生)
//或e=Mr. Wang<[email]wang@zte.com[/email]>
p=* (phone number) //p=+86-0755-26773000-7110(wang)
//or p=+1 617 253 6011
c=* (connection information -如已經包含在所有媒體中則該行不需要)
//c=<網絡類型><地址信息><連接地址>
//多點會議包括TTL
//連接地址: <base multicast
//address>/<ttl>/<number of addresses>
//c=IN IP4 224.2.13.23/127
//c=IN IP4 224.2.1.1/127/3
b=* (bandwidth information) //b=<修改量(CT Conference Total
//IAS Application-specific Max)>:<帶寬
//值(kb/s)>
//b=CT:120
One or more time descriptions (see below)
z=* (time zone adjustments) //時區調整
k=* (encryption key) //k=<方法>:<密鑰>或k=<方法>
a=* (zero or more session attribute lines) //a=<屬性> 或a=<屬性>:<值>
Zero or more media descriptions (see below)
各行嚴格按順序,其中:
時間描述:
t= (time the session is active) //<開始時間><結束時間>,單位秒,十
//進制NTP
//t=2873397468 2873404969
r=* (zero or more repeat times) //<重復時間><活動持續時間
//以開始時刻為參考的偏移列表>單位秒
//r=604800 3666 90000 或寫成
//r=7d 1h 0 25h
媒體描述:
m= (media name and transport address) //m=<媒體><端口><傳送><格式列表>
//m=audio 49170 RTP/AVP 0 3
//協議為RTP,剖面為AVP
//參考rtp-parameters.txt
i=* (media title媒體稱呼) //
c=* (connection information – 如已經包含在會話級描述則為可選)
b=* (bandwidth information) //同c
k=* (encryption key) //會話級為摸認值,同c
a=* (zero or more media attribute lines) //兩種形式:(也同c)(見后說明)
//a=<attribute>如:
// a=recvonly
//a=<attribute>:<value>
注:v,o,s,t,m為必須的,其他項為可選。
如果SDP語法分析器不能識別某一類型(Type),則整個描述丟失;
如果”a=”的某屬性值不理解,則予以丟失
整個協議區分大小寫
“=”兩側不允許有空格
會話級的描述就是媒體級描述的缺省值
所有均格式為<type>=<value>
3. SDP在IP電話中的使用
SDP用於構建INVITE和200 OK響應消息的消息體,供主\被叫用戶交換媒體信息.
1. 媒體流的配置
1) 主被叫的媒體描述必須完全對應:主被叫的第n個媒體流(“m=”)對應,都包含”a=rtpmap”.這樣的目的是易於適應靜態凈荷類型到動態凈荷類型的轉換.
2) 如被叫不想接收主叫提出的某個媒體流則在響應中設置該媒體流的端口號為0.並且,必須返回對應的媒體流行.
2. 單播SDP值的設定
1) 對於只發媒體流,端口號無意義,應設為0.
2) 每個媒體流的凈載荷類型例表應傳送兩個信息:能接受/發送的編譯碼,和用以標識這些編譯碼的RTP凈載荷類型號.
3) 如對於某一媒體流,主/被叫沒有公共的媒體格式,被叫仍然要求返回媒體流的”m=”行,端口好為0,同時,不列凈載荷類型.
4) 如果所有媒體流均無公共的媒體格式,則被叫回送400響應(壞請求),並加入304警告頭字段(無媒體類型)
3. 多播操作
1) 接受和發送的多播地址是相同的
2) 被叫不允許改變媒體流的只發,只收,或收/發特性
3) 如果被叫不支持多播,則回送400響應和330警告(多播不可用)
4. 延時媒體流
由於主叫可能實際上是一個和其他協議(如H.323)互同的協議的網關,與S其互同的協議要求呼叫建立后進行媒體協商.這樣,主叫可以先發不帶SDP的INVITE,呼叫建立后可以通過ACK或重新發一個INVITE請求修改被叫的會話描述(SDP).
5. 媒體流保持
如果要求對方進入HOLD,即暫時停止發送一個或多個媒體流,這可以用Re-INVITE,其會話描述和原來的請求或響應中的描述相同,只是,”c=”行中的保持媒體流的地址置為”0.0.0.0”,還有就是Re_INVITE中的Cseq得遞增.
6. 對應於SIP中有3個實體字段:
1) Content-Type: 指明消息體類型,有兩種:
i. Application/sdp:表示是SDP會話描述
ii. Text/html:表示是普通文本或HTML格式的描述
2) Content-Encoding:補充說明消息體類型,使用戶可以采用壓縮編碼編輯消息體
3) Content-Length:給出消息體的字節數
7. SDP各type的詳細解釋:
協議版本 v = SDP版本目前為0,沒有子版本
會話源 o = <用戶名>用戶在發起主機上登錄名,如果主機不支持用戶標識的概念,則為”-”
<會話id>一般為數字串,其分配由創建工具決定,建議用網絡時間協議(NTP)時
戳,以確保唯一性.
<版本>該會話公告的版本,供公告代理服務器檢測同一會話的若干個公告哪個
是最新公告.基本要求是會話數據修改后該版本值遞增,建議用NTP時戳
<網絡類型>為文本串”IN”
<地址類型>”IP4”(可為域名或點分十進制)/”IP6”(域名或壓縮文本地址形式)
<地址>
會話名 s= ISO 10646字符表示的會話名
會話信息 v= ISO 10646字符表示的會話信息
URI u= 能提供會議進一步信息的URI地址
E妹地址 e= 給出會議負責人的聯系信息,他不一定是創建會議公告的人
電話號碼 p= 給出會議負責人的聯系信息,他不一定是創建會議公告的人(國際通用形式)
連接數據 c=媒體連接數據,會話級為媒體級的摸認值
帶寬 b= 給出會話或媒體所用帶寬,單位為kbit/s.修飾語:CT(會議總帶寬,表示所有
地點所有媒體的總帶寬),AS(應用特定最大帶寬,表示一個地點單一媒體帶寬)
時間描述 t= 見上
r= 見上
時區調整 z= 見上
加密密鑰 k=已定義的方法有
k=clear:<加密密鑰>密鑰沒有變換
k=base64:<編碼密鑰>已編碼,因為它含有SDP禁用的字符
k=uri:<獲得密鑰的URI>
k=prompt。SDP沒有提供密鑰但該會話或媒體流是要求加密的。
屬性 a=一個m=行可有多個a=行,SDP建議擴展如下:(具體見[1].Page419)
會話級: a=cat:<類別>//給出點分層次式會話分類號,供接收方篩選會話
a=keywds:<關鍵詞>//供接收方篩選會話
a=tool:<工具名和版本號>//創建會話描述的工具名和版本號
a=recvonly/sendrecv/sendonly//收發模式
a=type:<會議類型>//有:廣播,聚會,主席主持,測試,H.323
a=charset:<字符集>//顯示會話名和信息數據的字符集
a=sdplang:<語言標記>//描述所有語言
a=lang:<語言標記>//會話描述的缺省語言或媒體描述的語言
a=framerate:<幀速率>//單位:幀/秒
a=quality:<質量>//視頻的建議質量(10/5/0)
a=fmtp:<格式>< 格式特定參數>//定義指定格式的附加參數
媒體級:a=ptime:<分組時間>//媒體分組的時長(單位:秒)
a=recvonly/sendrecv/sendonly//收發模式
a=orient:<白板方向>//指明白板在屏莫上的方向
a=sdplang:<語言標記>//描述所有語言
a=lang:<語言標記>//會話描述的缺省語言或媒體描述的語言
媒體描述 m= <媒體>有5種類型:音頻/視頻/應用(如白板信息)/數據(不向用戶顯示的)/控制
<端口>媒體流發往傳輸層的端口。取決於c=行規定的網絡類型和接下來的傳
送層協議:對UDP為1024-65535;對分層編碼應用(c=行沒有多播地址),
要給出多播端口數,如:m=video 49170/2 RTP/AVP 31(表示:端口49170
和49171為第一對RTP/RTCP端口,49172和49173為第二對的端口)。
<傳送層協議>與c=行的地址類型有關。對大多的媒體在RTP/UDP上傳送,定
義2種:RTP/AVP:IETF RTP協議,音/視頻應用文檔。在UDP上傳誦。
Udp:UDP協議。
<格式列表>對音/視頻,就是音/視頻應用文檔中規定媒體凈荷類型。列表中都
有可能用,但第一個為缺省值,分為靜態綁定和動態綁定:靜態綁定即使媒體編碼方式有凈荷類型號完全確定,動態綁定則媒體編碼方式如時鍾頻率,音頻信道數等)沒有完全確定,需要進一步的屬性說明。分別舉例如下:
Alaw的PCM編碼單信道Audio,其凈荷類型號為8,把它發往UDP端口49232,則:m=audio 49232 RTP/AVP 8
16bit線性編碼,雙聲道立體聲,抽樣速率16kHz,其動態凈荷類型號98,則:m=audio 49232 RTP/AVP 98
a=rtpmap:98 L16/16000/2
說明:1)a=rtpmap:<凈荷類型號><編碼名>/<時鍾速率>[/<編碼參數>]
對音頻,編碼參數為音頻信道數;對視頻沒有定義
2)SDP允許rtpmap規定實驗性編碼格式,但編碼名必須以X-起,
表示此格式還沒正式登記。
4. SDP Grammar
announcement = proto-version
origin-field
session-name-field
information-field
uri-field
email-fields
phone-fields
connection-field
bandwidth-fields
time-fields
key-field
attribute-fields
media-descriptions
proto-version = "v=" 1*DIGIT CRLF
;this memo describes version 0
origin-field = "o=" username space
sess-id space sess-version space
nettype space addrtype space
addr CRLF
session-name-field = "s=" text CRLF
information-field = ["i=" text CRLF]
uri-field = ["u=" uri CRLF]
email-fields = *("e=" email-address CRLF)
phone-fields = *("p=" phone-number CRLF)
connection-field = ["c=" nettype space addrtype space
connection-address CRLF]
;a connection field must be present
;in every media description or at the
;session-level
bandwidth-fields = *("b=" bwtype ":" bandwidth CRLF)
time-fields = 1*( "t=" start-time space stop-time
*(CRLF repeat-fields) CRLF)
[zone-adjustments CRLF]
repeat-fields = "r=" repeat-interval space typed-time
1*(space typed-time)
zone-adjustments = time space ["-"] typed-time
*(space time space ["-"] typed-time)
key-field = ["k=" key-type CRLF]
key-type = "prompt" |
"clear:" key-data |
"base64:" key-data |
"uri:" uri
key-data = email-safe | "~" | "
attribute-fields = *("a=" attribute CRLF)
media-descriptions = *( media-field
information-field
*(connection-field)
bandwidth-fields
key-field
attribute-fields )
media-field = "m=" media space port ["/" integer]
space proto 1*(space fmt) CRLF
media = 1*(alpha-numeric)
;typically "audio", "video", "application"
;or "data"
fmt = 1*(alpha-numeric)
;typically an RTP payload type for audio
;and video media
proto = 1*(alpha-numeric)
;typically "RTP/AVP" or "udp" for IP4
port = 1*(DIGIT)
;should in the range "1024" to "65535" inclusive
;for UDP based media
attribute = (att-field ":" att-value) | att-field
att-field = 1*(alpha-numeric)
att-value = byte-string
sess-id = 1*(DIGIT)
;should be unique for this originating username/host
sess-version = 1*(DIGIT)
;0 is a new session
connection-address = multicast-address
| addr
multicast-address = 3*(decimal-uchar ".") decimal-uchar "/" ttl
[ "/" integer ]
;multicast addresses may be in the range
;224.0.0.0 to 239.255.255.255
ttl = decimal-uchar
start-time = time | "0"
stop-time = time | "0"
time = POS-DIGIT 9*(DIGIT)
;sufficient for 2 more centuries
repeat-interval = typed-time
typed-time = 1*(DIGIT) [fixed-len-time-unit]
fixed-len-time-unit = "d" | "h" | "m" | "s"
bwtype = 1*(alpha-numeric)
bandwidth = 1*(DIGIT)
username = safe
;pretty wide definition, but doesn't include space
email-address = email | email "(" email-safe ")" |
email-safe "<" email ">"
email = ;defined in RFC822
uri= ;defined in RFC1630
phone-number = phone | phone "(" email-safe ")" |
email-safe "<" phone ">"
phone = "+" POS-DIGIT 1*(space | "-" | DIGIT)
;there must be a space or hyphen between the
;international code and the rest of the number.
nettype = "IN"
;list to be extended
addrtype = "IP4" | "IP6"
;list to be extended
addr = FQDN | unicast-address
FQDN = 4*(alpha-numeric|"-"|".")
;fully qualified domain name as specified in RFC1035
unicast-address = IP4-address | IP6-address
IP4-address = b1 "." decimal-uchar "." decimal-uchar "." b4
b1 = decimal-uchar
;less than "224"; not "0" or "127"
b4 = decimal-uchar
;not "0"
IP6-address = ;to be defined
text = byte-string
;default is to interpret this as IS0-10646 UTF8
;ISO 8859-1 requires a "a=charset:ISO-8859-1"
;session-level attribute to be used
byte-string = 1*(0x01..0x09|0x0b|0x0c|0x0e..0xff)
;any byte except NUL, CR or LF
decimal-uchar = DIGIT
| POS-DIGIT DIGIT
| ("1" 2*(DIGIT))
| ("2" ("0"|"1"|"2"|"3"|"4") DIGIT)
| ("2" "5" ("0"|"1"|"2"|"3"|"4"|"5"))
integer = POS-DIGIT *(DIGIT)
alpha-numeric = ALPHA | DIGIT
DIGIT = "0" | POS-DIGIT
POS-DIGIT = "1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
ALPHA = "a"|"b"|"c"|"d"|"e"|"f"|"g"|"h"|"i"|"j"|"k"|
"l"|"m"|"n"|"o "|"p"|"q"|"r"|"s"|"t"|"u"|"v"|
"w"|"x"|"y"|"z"|"A"|"B"|"C "|"D"|"E"|"F"|"G"|
"H"|"I"|"J"|"K"|"L"|"M"|"N"|"O"|"P"|" Q"|"R"|
"S"|"T"|"U"|"V"|"W"|"X"|"Y"|"Z"
email-safe = safe | space | tab
safe = alpha-numeric |
"'" | "'" | "-" | "." | "/" | ":" | "?" | """ |
"#" | "$" | "&" | "*" | ";" | "=" | "@" | "[" |
"]" | "^" | "_" | "`" | "{" | "|" | "}" | "+" |
"~" | "
space = %d32
tab = %d9
CRLF = %d13.10
常見的如下:
a=rtpmap:103 ISAC/16000
a=rtpmap:102 iLBC/8000
a=rtpmap:3 GSM/8000
a=rtpmap:106 telephone-event/8000
a=rtpmap:13 CN/8000
a=rtpmap:117 red/8000
a=rtpmap:18 G729a/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:2 G726-32/8000
a=rtpmap:4 G723/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:96 G726-40/8000
a=rtpmap:97 G726-24/8000
a=rtpmap:98 G726-16/8000
a=rtpmap:100 NSE/8000
a=rtpmap:101 telephone-event/8000
a=rtpmap:0 pcmu/8000
a=rtpmap:8 pcma/8000
a=rtpmap:3 gsm/8000
a=rtpmap:18 G729/8000
a=rtpmap:98 iLBC/8000
a=rtpmap:97 speex/8000
a=rtpmap:101 telephone-event/8000