2020年12月6日 星期日

SDP (Session Description Protocol) 格式及屬性解析



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

SDP協議總結

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

WebRTC H.264 编码的 Profile 和 Level

沒有留言:

張貼留言