webrtc sdp(會話傳輸協議)詳解
阿新 • • 發佈:2020-11-12
1、什麼是sdp
SDP(Session Description Protocol)描述會話協議,它只是一種資訊格式的描述標準,本身不屬於傳輸協議,但是可以被其他傳輸協議用來交換必要的資訊,用於兩個會話實體之間的媒體協商。
2、sdp協議結構
SDP的文字資訊包括:
- 會話資訊
- 網路資訊
- 媒體資訊
- 安全資訊
- 服務質量和分組資訊
+---------------------+ | v= | +---------------------+ +---------------------+ +---------------------+ ==== | Session Metadata | ===== | o= | | +---------------------+ +---------------------- | +---------------------+ | | t= | | +---------------------+ | | | +---------------------+ | | c= | | +---------------------+ | +---------------------+ ==== | Network Description | ===== | +---------------------+ | +---------------------+ | | a=candidate | | +---------------------+ | | | +---------------------+ | | m= | | +---------------------+ | +---------------------+ +---------------------+ ==== | Stream Description | ===== | a=rtpmap | | +---------------------+ +---------------------- | +---------------------+ | | a=fmtp | | +---------------------+ | +---------------------+ | | a=sendrecv.. | | +---------------------+ +---------------+ | SEMANTIC | | COMPONENTS OF | | SDP | +---------------+ | +---------------------+ | | a=crypto | | +---------------------+ | +---------------------+ +---------------------+ ==== |Security Descriptions| =====| a=ice-frag | | +---------------------+ +---------------------- | +---------------------+ | | a=ice-pwd | | +---------------------+ | +---------------------+ | | a=fingerprint | | +---------------------+ | | | | +---------------------+ | | a=rtcp-fb | | +---------------------+ | +---------------------+ +---------------------+ ==== | Qos,Grouping | | | | Descriptions | =====| a=group | +---------------------+ +---------------------- +---------------------+ | a=rtcpmux | +---------------------+
sdp格式
SDP描述由許多文字行組成,文字行的格式為<型別>=<值>,<型別>是一個字母,<值>是結構化的文字串,其格式依<型別>而定,每個SDP有一個會話級描述、多個媒體級描述。
<type>=<value>
<type>: 區分大小寫,代表特定的屬性,例如v代表SDP版本。
<value>:UTF8編碼的文字,具體格式與型別有關。
=兩邊不允許存在空格。
=*表示該項是可選的。
會話的名稱和目的 Session Description
v = (協議版本)
o = (所有者/建立者和會話識別符號)
s = (會話名稱)
i = * (會話資訊)
u = * (URI 描述)
e = * (Email 地址)
p = * (電話號碼)
c = * (連線資訊 ― 如果包含在所有媒體中,則不需要該欄位)
b = * (頻寬資訊)
會話存活時間 Time Description
t = (會話活動時間)
r = * (0或多次重複次數)
構成會話的媒體(會話中包括多個媒體)
SDP的媒體資訊 Media Description
媒體格式
傳輸協議
傳輸IP和埠
媒體負載型別(VP8、VP9、H264、H265)
m = (媒體名稱和傳輸地址)
i = * (媒體標題)
c = * (連線資訊 — 如果包含在會話層則該欄位可選)
b = * (頻寬資訊)
k = * (加密金鑰)
a = * (0 個或多個會話屬性行)
3、sdp例項
【Session Metadata部分】 v=0 //sdp版本號,一直為0,rfc4566規定 o=- 7017624586836067756 2 IN IP4 127.0.0.1 //origion/owner o=<username> <session id> <version> <network type> <address type> <unicast-address> //username如何沒有使用-代替,7017624586836067756是整個會話的編號,2代表會話版本,如果在會話 //過程中有改變編碼之類的操作,重新生成sdp時,sess-id不變,sess-version加1 s=- //會話名,必選,沒有的話使用-代替 t=0 0 //兩個值分別是會話的起始時間和結束時間,這裡都是0代表沒有限制 a=group:BUNDLE audio video data //需要共用一個傳輸通道傳輸的媒體,如果沒有這一行,音視訊,資料就會分別單獨用一個udp埠來發送 a=msid-semantic: WMS h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C //WMS是WebRTC Media Stream簡稱,這一行定義了本客戶端支援同時傳輸多個流,一個流可以包括多個track, //一般定義了這個,後面a=ssrc這一行就會有msid,mslabel等屬性 【Stream Description部分】 【audio部分】 m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126 //m = <media><port><transport><fmt/payload type list> //m=audio說明本會話包含音訊,9代表音訊使用埠9來傳輸,但是在webrtc中一現在一般不使用,如果設定為0,代表不 //傳輸音訊,UDP/TLS/RTP/SAVPF是表示使用者來傳輸音訊支援的協議,udp,tls,rtp代表使用udp來傳輸rtp包,並使用tls加密 //SAVPF代表使用srtcp的反饋機制來控制通訊過程,後臺111 103 104 9 0 8 106 105 13 126表示本會話音訊支援的編碼,後臺幾行會有詳細補充說明 c=IN IP4 0.0.0.0 //這一行表示你要用來接收或者傳送音訊使用的IP地址,webrtc使用ice傳輸,不使用這個地址 a=rtcp:9 IN IP4 0.0.0.0 //用來傳輸rtcp地地址和埠,webrtc中不使用 a=ice-ufrag:khLS a=ice-pwd:cxLzteJaJBou3DspNaPsJhlQ //以上兩行是ice協商過程中的安全驗證資訊 a=fingerprint:sha-256 FA:14:42:3B:C7:97:1B:E8:AE:0C2:71:03:05:05:16:8F:B9:C7:98:E9:60:43:4B:5B:2C:28:EE:5C:8F3:17 //以上這行是dtls協商過程中需要的認證資訊 a=setup:actpass //以上這行代表本客戶端在dtls協商過程中,可以做客戶端也可以做服務端,參考rfc4145 rfc4572 a=mid:audio //在前面BUNDLE這一行中用到的媒體標識 a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level //上一行指出我要在rtp頭部中加入音量資訊,參考 rfc6464 a=sendrecv //上一行指出我是雙向通訊,另外幾種型別是recvonly,sendonly,inactive a=rtcp-mux //上一行指出rtp,rtcp包使用同一個埠來傳輸 //下面幾行都是對m=audio這一行的媒體編碼補充說明,指出了編碼採用的編號,取樣率,聲道等 a=rtpmap:111 opus/48000/2 //可選 a=rtpmap:<fmt/payload type><encoding name>/<clock rate>[/<encodingparameters>] a=rtcp-fb:111 transport-cc //以上這行說明opus編碼支援使用rtcp來控制擁塞,參考https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01 a=fmtp:111 minptime=10;useinbandfec=1 //可選 a=fmtp:<fmt/payload type> parameters 對rtpmap進一步說明 //對opus編碼可選的補充說明,minptime代表最小打包時長是10ms,useinbandfec=1代表使用opus編碼內建fec特性 a=rtpmap:103 ISAC/16000 a=rtpmap:104 ISAC/32000 a=rtpmap:9 G722/8000 a=rtpmap:0 PCMU/8000 a=rtpmap:8 PCMA/8000 a=rtpmap:106 CN/32000 a=rtpmap:105 CN/16000 a=rtpmap:13 CN/8000 a=rtpmap:126 telephone-event/8000 a=ssrc:18509423 cname:sTjtznXLCNH7nbRw //cname用來標識一個數據源,ssrc當發生衝突時可能會發生變化,但是cname不會發生變化,也會出現在rtcp包中SDEC中, //用於音視訊同步 a=ssrc:18509423 msid:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C 15598a91-caf9-4fff-a28f-3082310b2b7a //以上這一行定義了ssrc和WebRTC中的MediaStream,AudioTrack之間的關係,msid後面第一個屬性是stream-d,第二個是track-id a=ssrc:18509423 mslabel:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C a=ssrc:18509423 label:15598a91-caf9-4fff-a28f-3082310b2b7a 【video部分】 m=video 9 UDP/TLS/RTP/SAVPF 100 101 107 116 117 96 97 99 98 //參考上面m=audio,含義類似 c=IN IP4 0.0.0.0 a=rtcp:9 IN IP4 0.0.0.0 a=ice-ufrag:khLS a=ice-pwd:cxLzteJaJBou3DspNaPsJhlQ a=fingerprint:sha-256 FA:14:42:3B:C7:97:1B:E8:AE:0C2:71:03:05:05:16:8F:B9:C7:98:E9:60:43:4B:5B:2C:28:EE:5C:8F3:17 a=setup:actpass a=mid:video a=extmap:2 urn:ietf:params:rtp-hdrext:toffset a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time a=extmap:4 urn:3gpp:video-orientation a=extmap:5 http://www.ietf.org/id/draft-hol ... de-cc-extensions-01 a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay a=sendrecv a=rtcp-mux a=rtcp-rsize a=rtpmap:100 VP8/90000 a=rtcp-fb:100 ccm fir //ccm是codec control using RTCP feedback message簡稱,意思是支援使用rtcp反饋機制來實現編碼控制,fir是Full Intra Request //簡稱,意思是接收方通知傳送方傳送幅完全幀過來 a=rtcp-fb:100 nack //支援丟包重傳,參考rfc4585 a=rtcp-fb:100 nack pli //支援關鍵幀丟包重傳,參考rfc4585 a=rtcp-fb:100 goog-remb //支援使用rtcp包來控制傳送方的碼流 a=rtcp-fb:100 transport-cc //參考上面opus a=rtpmap:101 VP9/90000 a=rtcp-fb:101 ccm fir a=rtcp-fb:101 nack a=rtcp-fb:101 nack pli a=rtcp-fb:101 goog-remb a=rtcp-fb:101 transport-cc a=rtpmap:107 H264/90000 a=rtcp-fb:107 ccm fir a=rtcp-fb:107 nack a=rtcp-fb:107 nack pli a=rtcp-fb:107 goog-remb a=rtcp-fb:107 transport-cc a=fmtp:107 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f //h264編碼可選的附加說明 a=rtpmap:116 red/90000 //fec冗餘編碼,一般如果sdp中有這一行的話,rtp頭部負載型別就是116,否則就是各編碼原生負責型別 a=rtpmap:117 ulpfec/90000 //支援ULP FEC,參考rfc5109 a=rtpmap:96 rtx/90000 a=fmtp:96 apt=100 //以上兩行是VP8編碼的重傳包rtp型別 a=rtpmap:97 rtx/90000 a=fmtp:97 apt=101 a=rtpmap:99 rtx/90000 a=fmtp:99 apt=107 a=rtpmap:98 rtx/90000 a=fmtp:98 apt=116 a=ssrc-group:FID 3463951252 1461041037 //在webrtc中,重傳包和正常包ssrc是不同的,上一行中前一個是正常rtp包的ssrc,後一個是重傳包的ssrc a=ssrc:3463951252 cname:sTjtznXLCNH7nbRw a=ssrc:3463951252 msid:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C ead4b4e9-b650-4ed5-86f8-6f5f5806346d a=ssrc:3463951252 mslabel:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C a=ssrc:3463951252 label:ead4b4e9-b650-4ed5-86f8-6f5f5806346d a=ssrc:1461041037 cname:sTjtznXLCNH7nbRw a=ssrc:1461041037 msid:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C ead4b4e9-b650-4ed5-86f8-6f5f5806346d a=ssrc:1461041037 mslabel:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C a=ssrc:1461041037 label:ead4b4e9-b650-4ed5-86f8-6f5f5806346d m=application 9 DTLS/SCTP 5000 c=IN IP4 0.0.0.0 a=ice-ufrag:khLS a=ice-pwd:cxLzteJaJBou3DspNaPsJhlQ a=fingerprint:sha-256 FA:14:42:3B:C7:97:1B:E8:AE:0C2:71:03:05:05:16:8F:B9:C7:98:E9:60:43:4B:5B:2C:28:EE:5C:8F3:17 a=setup:actpass a=mid:data a=sctpmap:5000 webrtc-datachannel 1024