WebRTC中的SDP
SDP簡介
在WebRTC的通信過程中,SDP是其中重要的協(xié)議。SDP(Session Description Protocol)全稱是會(huì)話描述協(xié)議。主要用于兩個(gè)會(huì)話實(shí)體之間的媒體協(xié)商。WebRTC引入SDP來描述媒體信息,用于媒體協(xié)商時(shí)決定雙方是否可以進(jìn)行通信,以及用何種方式進(jìn)行通信。SDP作為WebRTC的信令系統(tǒng)的一部分,驅(qū)動(dòng)著WebRTC的運(yùn)轉(zhuǎn)。從這個(gè)角度來說,SDP是WebRTC的靈魂。
標(biāo)準(zhǔn)SDP規(guī)范
標(biāo)準(zhǔn)SDP結(jié)構(gòu)由一個(gè)會(huì)話級(jí)描述和多個(gè)媒體級(jí)描述組成,通常SDP中都會(huì)包含一個(gè)音頻媒體描述和一個(gè)視頻媒體描述。
每條描述信息都是 <type> = <value> 的形式(“=” 兩側(cè)不允許有空格存在。)。其中,<type>是描述的目標(biāo),它由單個(gè)字符構(gòu)成;<value>是對<type>的解釋或約束。會(huì)話和媒體都有各自的<type>,另外還有一些公共的<type>。
常見的<type>如下:
會(huì)話級(jí)
v=(protocol version,協(xié)議版本) o=(owener/creator and session identifier,會(huì)話的創(chuàng)建者) s=(session name,會(huì)話名稱) t=(time the session is active,會(huì)話存活時(shí)間)媒體級(jí)
m=(media,媒體)公共
c=(connection information,網(wǎng)絡(luò)信息) a=(attribute,屬性)這是一個(gè)典型簡化后的的SDP示例:
v=0 o=- 5910110687297165449 2 IN IP4 127.0.0.1 s=- t=0 0 ...//第一個(gè)媒體流,音頻流 m=audio 54797 UDP/TLS/RTP/SAVPF 8 ...//第2個(gè)媒體流,視頻流 m=video 9 UDP/TLS/RTP/SAVPF 125 ...WebRTC中的SDP
WebRTC對標(biāo)準(zhǔn)SDP規(guī)范做了一些調(diào)整,按功能分成會(huì)話描述和媒體描述。其中,會(huì)話描述屬于標(biāo)準(zhǔn)SDP中的內(nèi)容,通常我們不需要了解它。媒體描述中有WebRTC增加的內(nèi)容,需要了解一下的。媒體描述的內(nèi)容可以分成四個(gè)大類:媒體信息、網(wǎng)絡(luò)描述、安全描述、和服務(wù)質(zhì)量描述。如圖所示:
媒體信息
媒體信息是標(biāo)準(zhǔn)SDP的內(nèi)容,屬于SDP中的核心內(nèi)容。其格式如下所示:
m=<media> <port>/<numbers> <transport> <fmt>- <media>:媒體類型,audio、video等。
- <port>/<numbers>:端口,通常不會(huì)被使用。
- <transport>:傳輸協(xié)議,UDP、TCP等。
- <fmt>:媒體數(shù)據(jù)類型,通常為PayloadType列表。其具體含義需要在“a=rtpmap”中說明。
這里有幾個(gè)重要的屬性說明一下:
a=ssrc
ssrc是媒體源的唯一標(biāo)識(shí),每一路媒體流都有唯一的ssrc來標(biāo)識(shí)它。另外,在ssrc這一行中有時(shí)還能看到cname,這是就是該媒體流的別名。ssrc不同的媒體流可以有相同的cname,表示他們屬于同一個(gè)媒體流(比如,重傳流的cname就和原始流的相同)。
a=rtpmap
rtpmap是一張PayloadType與編碼器的映射表。其格式如下所示:
a=rtpmap:<payload type> <encoding name>/<clock rate>[/<encodingparameters>]- <payload type>:負(fù)載類型,與m line中的fmt中的對應(yīng)。
- <encoding name>:端口,編碼器名稱,如VP8,VP9,OPUS等。
- <clock rate>:采樣率。
- <encodingparameters>:編碼參數(shù),如音頻的聲道數(shù)信息。
a=fmtp
fmtp用于指定媒體數(shù)據(jù)格式。其格式如下所示:
a=fmtp:<payload type> <format specific parameters>- <payload type>:負(fù)載類型,與m line中的fmt中的對應(yīng)。
- <format specific parameters>:參數(shù)信息,其含義需要參考相關(guān)草案。
網(wǎng)絡(luò)描述
網(wǎng)絡(luò)描述也是標(biāo)準(zhǔn)SDP的內(nèi)容。其中記錄了傳輸媒體數(shù)據(jù)時(shí)使用的網(wǎng)絡(luò)信息。下面幾個(gè)是其中比較重要的屬性:
a=candidate
描述了候選地址信息,是一個(gè)已經(jīng)被廢棄的屬性,但因一些流媒體服務(wù)器上海有使用,所以WebRTC依然做了兼容
a=group:BUNDLE
指明哪些媒體數(shù)據(jù)可以復(fù)用同一個(gè)傳輸通道,以節(jié)約ICE資源。
a=rtcp-mux
指明RTP與RTCP是否復(fù)用同一端口,也是用以節(jié)約ICE資源。
a=rtcp-rsize
指明在用戶帶寬不足時(shí),縮減RTCP非關(guān)鍵包的大小。
a=ice-options
指明WebRTC收集ICE Candidate的策略。一般默認(rèn)為trickle(只要有可用的Candidate就進(jìn)行交換,不需要等待所有的Candidate收集完成才交換)。
安全描述
這部分內(nèi)容是WebRTC新增到SDP規(guī)范中去的。WebRTC的媒體通信提供了一套很好的安全機(jī)制。下面幾個(gè)是其中比較重要的屬性:
a=ice-ufrag和a=ice-pwd
指明ICE的賬號(hào)和密碼,用于驗(yàn)證用戶的合法性。
a=fingerprint
指明DTLS握手時(shí)的證書指紋,用于驗(yàn)證加密證書的有效性。
a=setup:(active/passive/actpass)
指明終端的角色,決定DTLS時(shí)是作為主動(dòng)握手方還是被動(dòng)連接方或是都可以。
服務(wù)質(zhì)量
這部分內(nèi)容也是WebRTC新增到SDP規(guī)范中去的。這個(gè)內(nèi)容只控制WebRTC中很小一部分服務(wù)質(zhì)量的開關(guān)。WebRTC中還包含有非常多的服務(wù)質(zhì)量內(nèi)容。只有以下一個(gè)屬性:
a=rtcp-fb
在媒體協(xié)商過程中,發(fā)起方的SDP中指明要開啟哪些RTCP反饋,而應(yīng)答方則在回復(fù)的SDP中確認(rèn)可以開啟哪些RTCP反饋。例如:
- nack:丟包重傳
- fir:申請關(guān)鍵幀
- transport-cc、goog-remb:擁塞控制算法。
Plan B和Unified Plan
目前,WebRTC中的SDP包含兩種規(guī)格,Plan B和Unified Plan。其中,Plan B是由標(biāo)準(zhǔn)SDP演化而來的,而Unified Plan是用來代替Plan B的新規(guī)格。兩者會(huì)在表達(dá)傳輸多路同類媒體流的時(shí)候格式會(huì)有區(qū)別。
在Plan B中,只有兩個(gè)媒體描述(m line),即音頻媒體描述(m=audio…)和視頻媒體描述(m=video…)。如果有多路同類媒體流則需要通過其媒體描述中的SSRC來區(qū)分。
而在Unified Plan中,每個(gè)媒體流都有一個(gè)媒體描述(m line)。
WebRTC SDP示例
v=0 //sdp版本號(hào),一直為0,rfc4566規(guī)定 o=- 7017624586836067756 2 IN IP4 127.0.0.1 //username,沒有的話使用-代替,7017624586836067756是整個(gè)會(huì)話的編號(hào),2表明會(huì)話版本 s=- //會(huì)話名,沒有的話使用-代替 t=0 0 //兩個(gè)值分別是會(huì)話的起始時(shí)間和結(jié)束時(shí)間,這里都是0表明沒有限制 a=group:BUNDLE audio video data //須要共用一個(gè)傳輸通道傳輸?shù)拿襟w,若是沒有這一行,音視頻,數(shù)據(jù)就會(huì)分別單獨(dú)用一個(gè)udp端口來發(fā)送 a=msid-semantic: WMS h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C //WMS是WebRTC Media Stream簡稱,這一行定義了本客戶端支持同時(shí)傳輸多個(gè)流,一個(gè)流能夠包括多個(gè) //track,通常定義了這個(gè),后面a=ssrc這一行就會(huì)有msid,mslabel等屬性m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126 //m=audio說明本會(huì)話包含音頻,9表明音頻使用端口9來傳輸,在webrtc中通常不使用, //若是設(shè)置為0,表明不傳輸音頻,UDP/TLS/RTP/SAVPF是表示用戶來傳輸音頻支持的協(xié)議, //udp、tls、rtp表明使用udp來傳輸rtp包,并使用tls加密; //SAVPF表明使用srtcp的反饋機(jī)制來控制通訊過程, //111 103 104 9 0 8 106 105 13 126表示本會(huì)話音頻支持的編碼,后臺(tái)幾行會(huì)有詳細(xì)補(bǔ)充說明c=IN IP4 0.0.0.0 //這一行表示你要用來接收或者發(fā)送音頻使用的IP地址,webrtc使用ice傳輸,不使用這個(gè)地址 a=rtcp:9 IN IP4 0.0.0.0 //用來傳輸rtcp地地址和端口,webrtc中不使用a=ice-ufrag:khLS a=ice-pwd:cxLzteJaJBou3DspNaPsJhlQ //以上兩行是ice協(xié)商過程當(dāng)中的安全驗(yàn)證信息 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協(xié)商過程當(dāng)中需要的證書指紋,用來驗(yàn)證DTLS證書的有效性a=setup:actpass //以上這行表明本客戶端在dtls協(xié)商過程當(dāng)中,能夠作客戶端也能夠作服務(wù)端,參考rfc4145 rfc4572 a=mid:audio //在前面BUNDLE這一行中用到的媒體標(biāo)識(shí) a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level //上一行指出我要在rtp頭部中加入音量信息,參考 rfc6464 a=sendrecv //上一行指出我是雙向通訊,另外幾種類型是recvonly,sendonly,inactive a=rtcp-mux //上一行指出rtp,rtcp包使用同一個(gè)端口來傳輸 a=rtpmap:111 opus/48000/2 //a=rtpmap都是對m=audio這一行的媒體編碼補(bǔ)充說明,指出了編碼采用的編號(hào),采樣率,聲道等 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 //對opus編碼可選的補(bǔ)充說明,minptime表明最小打包時(shí)長是10ms,useinbandfec=1表明使用opus編碼內(nèi)置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用來標(biāo)識(shí)一個(gè)數(shù)據(jù)源,ssrc當(dāng)發(fā)生沖突時(shí)可能會(huì)發(fā)生變化,可是cname不會(huì)發(fā)生變化,也會(huì)出現(xiàn)在rtcp包中SDEC中, //用于音視頻同步 a=ssrc:18509423 msid:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C 15598a91-caf9-4fff-a28f-3082310b2b7a //以上這一行定義了ssrc和WebRTC中的MediaStream,AudioTrack之間的關(guān)系,msid后面第一個(gè)屬性是stream-d,第二個(gè)是track-id a=ssrc:18509423 mslabel:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C a=ssrc:18509423 label:15598a91-caf9-4fff-a28f-3082310b2b7am=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.0a=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:17a=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=sendrecva=rtcp-mux a=rtcp-rsize a=rtpmap:100 VP8/90000 a=rtcp-fb:100 ccm fir //ccm是codec control using RTCP feedback message簡稱,意思是支持使用rtcp反饋機(jī)制來實(shí)現(xiàn)編碼控制, //fir是Full Intra Request簡稱,意思是接收方通知發(fā)送方發(fā)送幀過來 a=rtcp-fb:100 nack //支持丟包重傳,參考rfc4585 a=rtcp-fb:100 nack pli //支持關(guān)鍵幀丟包重傳,參考rfc4585 a=rtcp-fb:100 goog-remb //支持使用rtcp包來控制發(fā)送方的碼流 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頭部負(fù)載類型就是116,不然就是各編碼原生負(fù)責(zé)類型 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是不一樣的,上一行中前一個(gè)是正常rtp包的ssrc,后一個(gè)是重傳包的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-6f5f5806346dm=application 9 DTLS/SCTP 5000c=IN IP4 0.0.0.0a=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:17a=setup:actpass a=mid:data a=sctpmap:5000 webrtc-datachannel 1024總結(jié)
以上是生活随笔為你收集整理的WebRTC中的SDP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 时间序列规则和时间序列模型
- 下一篇: 参数化建模一些经验总结(3DS)