SDP (Session Description Protocol): RFC4566
SDP通常會用在會談初始化過程,用來傳送會談參與者的能力列表,以協調會談雙方的各項參數,例如:媒體的種類為 audio或 video,用來承載SDP的協定(RTP/UDP/IP, etc.),媒體的編碼方式(H.261 video, MPEG video, etc.)。
以 RTSP為例,在 RTSP 的溝通過程中,當用戶端詢問伺服器端URL的相關資訊時(發出 DESCRIBE),伺服器會將相關資訊以SDP的格式回復。用戶端可以藉此資訊決定要使用哪種codec與伺服器溝通。
主要用到 SDP的協議,包括SAP、RTP、RTSP、SIP、HTTP、Email的MIME extension。
SDP的基本格式為
<type>=<value>
< type >:exactly one case-significant character. ASCII編碼
<value>:is structured text whose format depends on <type>. 支援所有ISO 10646所定義的字元,使用UTF-8編碼
一個SDP訊息應該要包含三個部分,
Session description
v= (protocol version)
o= (originator 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)
Session description
v= (protocol version)
根據 RFC4566,此值定義為0。
o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
例如:o=jdoe 28908445262890842807 2 IN IP4 10.47.16.5
- 第一個數字28908445262890842807是會話唯一標誌
- 第二個數字2是會話的版本
- IN IP4 10.47.16.5 :"IN"表示"Internet",這段描述的是創建SDP的網絡IP和類型,與協商無關
s=<session name>
- 會談名稱,若要使用非ISO 10646的字元,則需要設定"a=charset",並且指名字符集。
i=<session description>
- 會談描述,提供human-readable的描述。
u=<uri>
URI連結,在SDP的會談描述中,最多只能存在一個URI。
e=<email-address>
電子郵件位址
p=<phone-number>
電話號碼
c=<nettype> <addrtype> <connection-address>
連線資訊,位址後方可以加上TTL,如下例:
c=IN IP4 224.2.36.42/127
c是連接行。此行給出您希望發送和接收實時流量的IP。因為ICE在WebRTC中是強制性的,所以c線中的IP將不被使用。
對於多個位址,如群播位址(multicast)的設定,如下例:設定三個位址
- 方法一:c=IN IP4 224.2.1.1/127/3
- 方法二:c=IN IP4 224.2.1.1/127c=IN IP4 224.2.1.2/127c=IN IP4 224.2.1.3/127
b=<bwtype>:<bandwidth>
建議頻寬,頻寬種類分為”CT”,”AS”,或是”X-“,頻寬的單位則為kilobits。CT:針對所有的媒體與溝通對象,需要的總頻寬。AS:application specified,針對某個特定的媒體與溝通對象,所需要的頻寬。X-:提供未來擴充用
Note that CT gives a total bandwidth figure for all the media at all sites. AS gives a bandwidth figure for a single media at a single site, although there may be many sites sending simultaneously.
z=<adjustment time> <offset> <adjustment time> <offset> ....
以 "t=" 與 "r=" 所設定的時間值為基礎時間,進行時間的調整。
例如:z=2882844526 -1h 2898848070 0
表示當時間為 2882844526 時,將時間設定為基礎時間減掉一個小時,當時間為2898848070時,恢復為基礎時間。
k=<method>
k=<method>:<encryption key>
用來加密傳送通道的鑰匙,RFC4556並不建議使用此種方式。若使用者使用此欄位,則通常需要再定義擴充屬性”a=”。大部分加密演算法都會需要兩把鑰匙,一個用來加密(confidentiality),一個用來確認資料沒被改變(integrity)。但RFC4556並不支援同時傳送兩把鑰匙。
k=clear:<encryption key>:用明碼傳送密鑰。
k=base64:<encoded encryption key>:使用BASE64傳送密鑰。
k=uri:<URI to obtain key>:透過URI取得密鑰。
k=prompt:使用者手動輸入用來解開此段資料的密鑰。
a=<attribute>
a=<attribute>:<value>
用來擴充 SDP協定,使其能夠支援使用者自行定義的屬性。可以針對 "media-level" 或 "session-level" 分別定義。
有兩種設定形式
- "a=<flag>",例如:"a=recvonly".
- "a=<attribute>:<value>",例如:"a=orient:landscape"
注意:此處所使用的字元並不會因為character set的設定而改變。任何新增的屬性應該要向IANA組織進行註冊。
Time description
用來描述會談開始的時間,以及重複啟動的時間。
t=<start-time> <stop-time>
此處的時間使用1900年1月1日開始的秒數來表示。開始和結束時間都設置成0,這意味著會話不受限於特定的時間。
r=<repeat interval> <active duration> <offsets from start-time>
格式為days ('d'), hours ('h'), minutes ('m') and seconds ('s'),
例如:開始時間為2010年8月1月10AM,每隔七天就會啟動1小時。其表示方法
方法一
t=3487140000 3487143600
r=604800 3600 0
方法二
t=3487140000 3487143600
r=7d 3600 0
Media description
m=<media> <port> <proto> <fmt>
m=<media> <port>/<number of ports> <proto> <fmt>
<media>:媒體種類,目前支援五種定義 "audio", "video", "text", "application", "message"
<port>:傳輸時使用的埠號,此處需要與”c=”設定的IP位址一併檢視。
<number of ports>:RTP session的個數。
<proto>:採用的協議(protocol),此份規格書定義了三種協議,udp、RTP/AVP、RTP/SAVP。
<fmt>:格式(format)
例如:
m=video 49170/2 RTP/AVP 31
表示定義了兩種 RTP/RTCP 傳輸,第一組使用 49170、49171,第一組使用 49172、49173。傳輸協議為RTP/AVP,格式為31。
C=IN IP4 224.2.1.1/127/2
表示定義了兩種 RTP/RTCP 傳輸,第一組使用IP位址為224.2.1.1,埠號為 49170、49171,第一組使用IP位址為224.2.1.2,埠號為 49172、49173。
例如:
m=audio 58779 UDP / TLS / RTP / SAVPF 111 103 104 9 0 8 106 105 13 126
m意味著它是一個媒體行 - 它收集了很多關於流媒體屬性的信息。按照這個順序,它告訴我們:音頻 - 媒體類型將用於會話(媒體類型在IANA註冊),
54278
RTP / SAVPF-傳輸協議將用於會話,最後但並非最不重要
111 103 104 0 8 106 105 13 126-瀏覽器支持媒體格式描述以發送和接收媒體。
RTP / SAVPF在RFC5124中定義。簡而言之,它需要使用SRTP和SRTCP和RTCP反饋數據包。
媒體格式描述,具有協議RTP / SAVPF,給出將要用於不同格式的RTP有效載荷數。低於96的有效負載數由IANA映射到編碼格式。在我們的SDP0地圖到G711U和8到G711A。大於95的格式號是動態的,並且有一個= rtpmap:屬性從RTP有效載荷類型編號映射到介質編碼名稱。還有alsoa = fmtp:attributes指定格式參數
SDP attributes各項設定
a=cat:<category>
會談分類,接收者可利用此欄位來過濾不想要的會談(session)。
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>]
將一個RTP封包類型號碼對應到用來編碼此封包格式的編碼名稱
原文:maps from an RTP payload type number (as used in an "m=" line) to an encoding name denoting the payload format to be used.
例如:
m=audio 49230 RTP/AVP 96 97 98
a=rtpmap:96 L8/8000
a=rtpmap:97 L16/8000
a=rtpmap:98 L16/11025/2
表示 RTP/AVP 會有三種封裝 96,97,98, 分別對應到編碼 L8/8000, L16/8000, L16/11025/2
a=recvonly
工具啟動時設定為純接收模式(receive only)
a=sendrecv
工具啟動時設定為發送/接收模式
a=sendonly
工具啟動時設定為純發送模式(send only)。
a=inactive
工具啟動時設定為無效模式(send only)。
a=orient:<orientation>
方向,通常用在電子白板或是展示時,有三種設定"portrait", "landscape", "seascape" (upside-down landscape).。
a=type:<conference type>
會談種類 "broadcast", "meeting", "moderated", "test", "H332", "recvonly"
a=charset:<character set>
字符集
a=sdplang:<language tag>
用來描述 SDP 資訊的語言
a=lang:<language tag>
媒體內容所採用的語言
a=framerate:<frame rate>
最大的影像禎數,單位為 frames/sec
a=quality:<quality>
影像編碼的品質,0表示最差,10表示最好
a=fmtp:<format> <format specific parameters>
SDP可以透過此屬性,將一個特殊的媒體格式與參數傳達給其他參與者。
a=group:BUNDLE audio video
BUNDLE 分組建立了包括在SDP中的多個媒體線路,通常是音頻和視頻之間的關係。在WebRTC中,它用於相同的RTP會話中復用多個媒體流。在這種情況下,瀏覽器提供多路復用音頻和視頻,但是還必須由另一方支持和接受。
a=msid-semantic:WMS lgsCFqt9kN2fVKw5wg3NKqGdATQoltEwOdMS
此行給出了在PeerConnection生命期間WebRTC媒體流(WMS)的唯一標識符。此標識符將用於屬於特定媒體流(在我們的例子中為音頻和視頻m行)的每個m行的a = msid屬性中。這意味著RTP媒體流(由每個RTP分組中存在的SSRC字段標識)屬於該媒體流,並且它是該媒體流的軌道。它是單個RTP媒體流到MediaStream WebRTC對象的顯式關聯。有關這方面的更多信息,請參閱draft-ietf-mmusic-msid
SDP的例子
v=0
o=jdoe 2890844526 2890842807 IN IP4 10.47.16.5
s=SDP Seminar
i=A Seminar on the session description protocol
u=http://www.example.com/seminars/sdp.pdf
e=j.doe@example.com (Jane Doe)
c=IN IP4 224.2.17.12/127
t=2873397496 2873404696
a=recvonly
m=audio 49170 RTP/AVP 0
m=video 51372 RTP/AVP 99
a=rtpmap:99 h263-1998/90000
參考資料
1.http://en.wikipedia.org/wiki/Session_Description_Protocol
2.RFC 4566
SIP SDP Profile-level-id解析
基於SIP協議的VOIP通信,該字段通常位於視頻協商sdp報文中,如:
video 23456 RTP/AVP 121
rtpmap:121 H264/90000
fmtp: 121 profile-level-id=42801E; packetization-mode=1
42801E分三部分
0x42 66
0x80 1000 0000 (二進制)
0x1E 30
對應profile_idc(8 bits)、profile_iop(8 bits)、level_idc(8 bits),含義如下:
profile_idc:(16進制)
66 Baseline profile (VOIP中常用這個)
77 Main profile
88 Extended profile
profile_iop:(8位分別意義)
constraint_set0_flag 1代表編碼的視頻序列完全遵從A.2.1所有條款,0不一定。
constraint_set1 _flag 1代表編碼的視頻序列完全遵從A.2.2所有條款,0不一定。
constraint_set2_flag 1代表編碼的視頻序列完全遵從A.2.3所有條款,0不一定。
注意:當上面3位有任意一位設置為1時,意味著視頻序列完全遵從A.2所有條款,當proifle_idc為44、100、110、122或244時,此三位必須為0。
constraint_set3_flag
(1)當profile_idc為66、77或88且level_idc為11時,1代表遵從Annex A for level 1b,0代表遵從Annex for level 1.1。
(2)當profile_idc為100或110,1代表遵從Annex A for the High 10 Intra profile,0不一定。
(3)當profile_idc為122,1代表遵從Annex A for the High 4:2:2 Intra profile,0不一定。
(4)當profile_idc為44,此數據位應設置為1,0是錯誤的。
(5)當profile_idc為244,1代表遵從Annex A for the High 4:4:4 Intra profile,0不一定。
(6)當profile_idc為66、77或88且level_idc不為11時,1保留給未來使用,應設置為0,同時解碼器應該忽略此數據位的值。
constraint_set4_flag
(1)當profile_idc為77、88或100,1代表frame_mbs_only_flag等於1,0則表示frame_mbs_only_flag可能1可能0。
(2)當profile_idc為118或128,,1代表編碼的視頻序列遵從H.10.1.1的所有條款,0不一定。
(3)當profile_idc不為以上兩條時,1保留給未來使用,應設置為0,同時解碼器應該忽略此數據位的值。
constraint_set5_flag
(1)當profile_idc為77、88或100,1代表Bslice類型不存在於編碼的視頻序列中,0不一定。
(2)當profile_idc為118,1代表遵從H.10.1.2的所有條款,0不一定。
(3)當profile_idc不為以上兩條時,1保留給未來使用,應設置為0,同時解碼器應該忽略此數據位的值。
constraint_set6_flag 保留,設置為0。
constraint_set7_flag 保留,設置為0。
levle_idc:
等級 最大比特率(BP、MP、EP)kbit/s 高分辨率示例@最高幀率(最大存儲幀)
1 64 128*96@30.9(8) 176*144@15.0(4)
1b 128 128*96@30.9(8) 176*144@15.0(4)
1.1 192 176*144@30.3(9) 320*240@10.0(3) 352*288@7.5(2)
1.2 384 320*240@20.0(7) 352*288@15.2(6)
1.3 768 320*240@36.0(7) 352*288@30.0(6)
2 2000 320*240@36.0(7) 352*288@30.0(6)
2.1 4000 352*480@30.0(7) 352*576@25.0(6)
2.2 4000 352*480@30.7(12) 352*576@25.6(10) 720*480@15.0(6) 720*576@12.5(5)
3 10000 352*480@61.4(12) 352*576@51.1(10) 720*480@30.0(6) 720*576@25.0(5)
3.1 14000 720*480@80.0(13) 720*576@66.7(11) 1280*720@30.0(5)
3.2 20000 1280*720@60.0(5) 1280*1024@42.2(4)
4 20000 1280*720@68.3(9) 1920*1080@30.1(4) 2048*1024@30.0(4)
4.1 50000 1280*720@68.3(9) 1920*1080@30.1(4) 2048*1024@30.0(4)
4.2 50000 1280*720@145.1(9) 1920*1080@64.0(4) 2048*1080@60.0(4)
5 135000 1920*1080@72.3(13) 2048*1024@72.0(13) 2048*1080@67.8(12) 2560*1920@30.7(5) 3672*1536@26.7(5)
5.1 240000 1920*1080@120.5(16) 2560*1920@51.2(9) 3840*2160@31.7(5) 4096*2048@30.0(5) 4096*2160@28.5(5) 4096*2304@26.7(5)
5.2 240000 1920*1080@172.0(16) 2560*1920@108.0(9) 3840*2160@66.8(5) 4096*2048@63.3(5) 4096*2160@60.0(5) 4096*2304@56.3(5)
其在協商中的值=level_idc*10的16進制數,如上面的1E=30,就是等級3,另外packetization-mode表示載荷類型,範圍0-2(0:NAL 1:非交錯2:交錯,隔行掃描)。
參考文檔:ITU-T H264 04/2013
沒有留言:
張貼留言