1 SDP 是什么
見名知意,SDP是session description protocol,會(huì)話描述協(xié)議。即SDP是一個(gè)描述一次會(huì)話的協(xié)議珊蟀。一般SDP用于多媒體通信中,由于視頻和音頻數(shù)據(jù)的復(fù)雜性外驱,不同編碼類型的音視頻流需要對(duì)應(yīng)的專門的編解碼器進(jìn)行編解碼操作育灸,經(jīng)過(guò)編解碼器的處理后音視頻方能夠傳輸或者播放。而對(duì)應(yīng)的編解碼器的初始化必須要知道響應(yīng)的音視頻信息昵宇,故SDP一般用于音視頻傳輸前通信雙方交流音視頻的屬性磅崭,便于雙方對(duì)接下來(lái)處理音視頻流的工作進(jìn)行必要的準(zhǔn)備。
webrtc通過(guò)SDP協(xié)商瓦哎,告知對(duì)端支持的音視頻編碼類型砸喻,編碼器參數(shù),音頻或者視頻的路數(shù)蒋譬,以及與音視頻相關(guān)的采樣率割岛,編碼等等,雙方根據(jù)各自的能力情況犯助,協(xié)商出待傳輸音視頻流的具體參數(shù)癣漆。
2 標(biāo)準(zhǔn)SDP規(guī)范
標(biāo)準(zhǔn)SDP規(guī)范主要包括SDP描述格式和SDP結(jié)構(gòu),而SDP結(jié)構(gòu)由會(huì)話描述和媒體信息描述兩個(gè)部分組成。媒體信息描述是整個(gè)SDP規(guī)范中最重要的部分剂买,他主要包括媒體類型惠爽、媒體格式癌蓖、傳輸協(xié)議、傳輸?shù)腎P和端口婚肆。
2.1 SDP的格式
SDP是由多個(gè) <type>=<value>
這邊的表達(dá)式組成的租副,其中<type>
是一個(gè)字符,<value>
是一個(gè)字符串旬痹。需要特別注意的是附井,“=”號(hào)兩邊是不能有空格的。
v=0
o=- 5910110687297165449 2 IN IP4 127.0.0.1
s=-
t=0 0
...
上面提到SDP由會(huì)話描述和媒體描述兩部分組成两残,并且一個(gè)SDP中會(huì)話描述只能有一個(gè),但是媒體描述可以有多個(gè)把跨。
- 會(huì)話級(jí)(session level)的作用域是整個(gè)會(huì)話人弓,即全部SDP。其位置從
v=
行開始着逐,到m=
行之前結(jié)束崔赌。 - 媒體級(jí)(media level)的作用域是單個(gè)的媒體流描述,其位置從
m=
開始耸别,到下一個(gè)m=
之前結(jié)束健芭。
下面是一個(gè)簡(jiǎn)化的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
...
//第3個(gè)媒體流慈迈, 數(shù)據(jù)通道
m=application 9 UDP/DTLS/SCTP webrtc-datachannel
...
2.2 SDP的結(jié)構(gòu)
從上一節(jié)的介紹中,可以知道SDP是結(jié)構(gòu)化布局的省有,先是會(huì)話級(jí)描述痒留,然后緊跟媒體級(jí)描述。下面逐一介紹個(gè)字段的含義
- 會(huì)話級(jí)描述
這里以一個(gè)樣例對(duì)SDP各字段的含義進(jìn)行逐一講解蠢沿。
v=0
//v=<version> (必選)
//這里的v表示SDP的版本伸头,即version的縮寫,其值為SDP的版本號(hào)
//SDP版本號(hào)舷蟀,一直為0恤磷,rfc4566規(guī)定
o=- 5910110687297165449 2 IN IP4 127.0.0.1
//o=<username> <session id> <version> <network type> <address type> <address>(必選)
//o=表示的是對(duì)會(huì)話發(fā)起者的描述, o是session owner的縮寫
//<username> 用戶名野宜,當(dāng)不關(guān)心用戶名的時(shí)候扫步,可以用 - 替代
//<session id> 此會(huì)話的標(biāo)識(shí)符,一般使用NTP時(shí)間戳
//<version> 表示此會(huì)話的版本速缨,會(huì)話建立后支持實(shí)時(shí)修改锌妻,此版本號(hào)就是一般用修改次數(shù)來(lái)表示
// <network type> 網(wǎng)絡(luò)類型,一般用“IN”旬牲,表示Internet
//<address type> 地址類型仿粹,一般為 "IP4"
// <address> IP地址
//7017624586836067756是整個(gè)會(huì)話的編號(hào)搁吓,2表明會(huì)話版本,
//若是在會(huì)話過(guò)程當(dāng)中有改變編碼之類的操作吭历,從新生成sdp時(shí),sess-id不變堕仔,sess-version加1
s=-
//s=<session name>(必選)
//該行表示此會(huì)話的名稱,不關(guān)心可以用 - 代替晌区。
t=0 0
//t=<start time> <stop time>(必選)
//t代表 time the session is active
//t=0 0 表示此會(huì)話是一個(gè)永久會(huì)話摩骨,永不失效
a=group:BUNDLE 0 1 2
// a=<type> 或 a=<type>:<values>
//此行表示屬性,用于進(jìn)一步說(shuō)明會(huì)話信息
//此例子表示將各媒體會(huì)話綁定起來(lái)創(chuàng)建一個(gè)組朗若,用于傳輸恼五。支持三種媒體流綁定傳輸
//a表示此行為 attribute line
//需要共用一個(gè)傳輸通道傳輸?shù)拿襟w,若是沒(méi)有這一行哭懈,音視頻灾馒,數(shù)據(jù)就會(huì)分別單獨(dú)用一個(gè)udp端口來(lái)發(fā)送
a=msid-semantic: WMS
//WMS是WebRTC Media Stream簡(jiǎn)稱,這一行定義了本客戶端支持同時(shí)傳輸多個(gè)流遣总,
//一個(gè)流能夠包括多個(gè)track,通常定義了這個(gè)睬罗,后面a=ssrc這一行就會(huì)有msid,mslabel等屬性
- 媒體級(jí)描述
媒體描述的字段很多,這里著重介紹4個(gè)旭斥。
m=(media name and transport address容达, 可選)
// m=<media> <port> <stransport> <fmt list>, 表示一個(gè)媒體描述
//<media> 媒體類型垂券,比如 audio/video等
//<port> 端口
//<transport> 傳輸協(xié)議花盐,有兩種RTP/AVP和UDP
//<fmt list> 媒體格式,即數(shù)據(jù)負(fù)載類型(payload type)列表
a=*(zero or more media attribute lines圆米, 可選)
//表示屬性卒暂,用于進(jìn)一步描述媒體信息。
//a=有兩個(gè)特別的屬性類型娄帖,即下面要介紹rtpmap和fmtp
a=rtpmap:125 H264/90000
//rtpmap(可選)也祠。
//a=rtpmap:<payload type> <encoding name>/<clock rate> [/<encodingparameters>]
//rtpmap是rtp與map的結(jié)合,即RTP參數(shù)映射表近速。
//<payload type> 負(fù)載類型诈嘿,對(duì)應(yīng)RTP包中的音視頻數(shù)據(jù)負(fù)載類型
//<encoding name> 編碼器名稱,如VP8削葱、VP9奖亚、OPUS
//<sample rate> 采樣率,如音頻的采樣率頻率32000析砸、48000等
//<encodingparameters> 編碼參數(shù)昔字,如音頻是否是雙聲道,默認(rèn)是單聲道
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
//a=fmtp:<payload type> <format specific parameters>
//fmtp 格式參數(shù),即format parameters
//<payload type> 負(fù)載類型作郭,同樣對(duì)應(yīng)RTP包中音視頻數(shù)據(jù)負(fù)載類型
//( level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f) H264編碼的可選附加參數(shù)
3 WebRTC中的SDP
webrtc對(duì)標(biāo)準(zhǔn)SDP規(guī)范做了一些調(diào)整陨囊,它將SDP按功能分成幾大塊:
- Session Metadata,會(huì)話元數(shù)據(jù)
- Network Description 網(wǎng)絡(luò)描述
- Stream Description夹攒, 流描述
- Security Description蜘醋,安全描述
- Qos Grouping Description,服務(wù)質(zhì)量描述
//=============會(huì)話描述====================
v=0
o=- 7017624586836067756 2 IN IP4 127.0.0.1
s=-
t=0 0
...
//================媒體描述=================
//================音頻媒體=================
/*
* 音頻使用端口1024收發(fā)數(shù)據(jù)
* UDP/TLS/RTP/SAVPF 表示使用 dtls/srtp 協(xié)議對(duì)數(shù)據(jù)加密傳輸
* 111咏尝、103 ... 表示本會(huì)話音頻數(shù)據(jù)的 Payload Type
*/
m=audio 1024 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126
//==============網(wǎng)絡(luò)描述==================
//指明接收或者發(fā)送音頻使用的IP地址压语,由于WebRTC使用ICE傳輸,這個(gè)被忽略编检。
c=IN IP4 0.0.0.0
//用來(lái)設(shè)置rtcp地址和端口胎食,WebRTC不使用
a=rtcp:9 IN IP4 0.0.0.0
...
//==============音頻安全描述================
//ICE協(xié)商過(guò)程中的安全驗(yàn)證信息
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=rtpmap:111 opus/48000/2
//minptime代表最小打包時(shí)長(zhǎng)是10ms,useinbandfec=1代表使用opus編碼內(nèi)置fec特性
a=fmtp:111 minptime=10;useinbandfec=1
...
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/8000
...
//=================視頻媒體=================
m=video 9 UDP/TLS/RTP/SAVPF 100 101 107 116 117 96 97 99 98
...
//=================網(wǎng)絡(luò)描述=================
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
...
//=================視頻安全描述=================
//進(jìn)入連通性檢測(cè)的用戶名
a=ice-ufrag:khLS
//密碼允懂,這兩個(gè)是用于連通性檢查的憑證
a=ice-pwd:cxLzteJaJBou3DspNaPsJhlQ
//DTLS指紋認(rèn)證斥季,以識(shí)別是否是合法用戶
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=mid:video
...
a=rtpmap:100 VP8/90000
//================服務(wù)質(zhì)量描述===============
a=rtcp-fb:100 ccm fir //解碼出錯(cuò),請(qǐng)求關(guān)鍵幀
a=rtcp-fb:100 nack //支持丟包重傳累驮,參考rfc4585
a=rtcp-fb:100 nack pli //與fir類似,
a=rtcp-fb:100 goog-remb //使用google的寬帶評(píng)估算法
a=rtcp-fb:100 transport-cc //啟動(dòng)防擁塞
...
4 webrtc SDP樣例
v=0
//sdp版本號(hào)舵揭,一直為0,rfc4566規(guī)定
o=- 7017624586836067756 2 IN IP4 127.0.0.1
//username如何沒(méi)有使用-代替谤专,7017624586836067756是整個(gè)會(huì)話的編號(hào),2表明會(huì)話版本
s=-
//會(huì)話名午绳,沒(méi)有的話使用-代替
t=0 0
//兩個(gè)值分別是會(huì)話的起始時(shí)間和結(jié)束時(shí)間置侍,這里都是0表明沒(méi)有限制
a=group:BUNDLE audio video data
//須要共用一個(gè)傳輸通道傳輸?shù)拿襟w,若是沒(méi)有這一行拦焚,音視頻蜡坊,數(shù)據(jù)就會(huì)分別單獨(dú)用一個(gè)udp端口來(lái)發(fā)送
a=msid-semantic: WMS h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C
//WMS是WebRTC Media Stream簡(jiǎn)稱,這一行定義了本客戶端支持同時(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說(shuō)明本會(huì)話包含音頻,9表明音頻使用端口9來(lái)傳輸僵刮,在webrtc中通常不使用据忘,
//若是設(shè)置為0,表明不傳輸音頻,UDP/TLS/RTP/SAVPF是表示用戶來(lái)傳輸音頻支持的協(xié)議搞糕,
//udp勇吊、tls、rtp表明使用udp來(lái)傳輸rtp包窍仰,并使用tls加密汉规;
//SAVPF表明使用srtcp的反饋機(jī)制來(lái)控制通訊過(guò)程,
//111 103 104 9 0 8 106 105 13 126表示本會(huì)話音頻支持的編碼,后臺(tái)幾行會(huì)有詳細(xì)補(bǔ)充說(shuō)明
c=IN IP4 0.0.0.0
//這一行表示你要用來(lái)接收或者發(fā)送音頻使用的IP地址驹吮,webrtc使用ice傳輸针史,不使用這個(gè)地址
a=rtcp:9 IN IP4 0.0.0.0
//用來(lái)傳輸rtcp地地址和端口晶伦,webrtc中不使用
a=ice-ufrag:khLS
a=ice-pwd:cxLzteJaJBou3DspNaPsJhlQ
//以上兩行是ice協(xié)商過(guò)程當(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é)商過(guò)程當(dāng)中須要的認(rèn)證信息
a=setup:actpass
//以上這行表明本客戶端在dtls協(xié)商過(guò)程當(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è)端口來(lái)傳輸
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
//上面幾行都是對(duì)m=audio這一行的媒體編碼補(bǔ)充說(shuō)明射亏,指出了編碼采用的編號(hào)近忙,采樣率,聲道等
//以上這行說(shuō)明opus編碼支持使用rtcp來(lái)控制擁塞智润,參考https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=fmtp:111 minptime=10;useinbandfec=1
//對(duì)opus編碼可選的補(bǔ)充說(shuō)明,minptime表明最小打包時(shí)長(zhǎng)是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用來(lái)標(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-3082310b2b7a
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簡(jiǎn)稱攘残,意思是支持使用rtcp反饋機(jī)制來(lái)實(shí)現(xiàn)編碼控制,
//fir是Full Intra Request簡(jiǎn)稱为狸,意思是接收方通知發(fā)送方發(fā)送幀過(guò)來(lái)
a=rtcp-fb:100 nack
//支持丟包重傳歼郭,參考rfc4585
a=rtcp-fb:100 nack pli
//支持關(guān)鍵幀丟包重傳,參考rfc4585
a=rtcp-fb:100 goog-remb
//支持使用rtcp包來(lái)控制發(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編碼可選的附加說(shuō)明
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-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