今天說說webRTC中的Session Description Protocol (SDP,會話描述協(xié)議)。
SDP是一系列信息的描述,包括
- IP address(這里指外網(wǎng)IP地址)
- Port number(端口號)
- Media type(媒體類型,包括音頻,視頻,白板等)
- Media encoding scheme(媒體編碼方案,常見的如視頻的H264,VP8;音頻的OPUS,ISAC等)
當(dāng)然,還有一些關(guān)于建立連接的一些信息,包括Offer/Answer,Candidate,以及啟停信息,下面都會一一講到。
SDP描述由許多文本行組成,文本行的格式為 <類型>= <值>, <類型>是一個字母, <值>是結(jié)構(gòu)化的文本串,其格式依 <類型>而定。
常見的比如m代表media,m=audio表示此行描述的是音頻信息相關(guān),m=video代表此行描述的是視頻信息相關(guān)。a代表屬性,比如a=candidate,表示這一行描述的是candidate信息。
我們先來看看一個完整的SDP是什么樣子的:
RTCSessionDescription:
offer
v=0
o=- 3887727723624511834 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio video data
a=msid-semantic: WMS ARDAMS
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 102 0 8 106 105 13 110 112 113 126
c=IN IP4 0.0.0.0
b=AS:20
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:GYAB
a=ice-pwd:bNJtuQXkD7eRYd9Nq8rqvg24
a=ice-options:trickle renomination
a=fingerprint:sha-256 6C:9A:98:1E:CB:80:6E:C5:DF:94:2B:3D:7E:3F:30:CB:14:BF:47:E5:BB:74:06:36:34:78:5E:61:39:79:06:65
a=setup:actpass
a=mid:audio
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=sendrecv
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/8000
a=rtpmap:102 ILBC/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:110 telephone-event/48000
a=rtpmap:112 telephone-event/32000
a=rtpmap:113 telephone-event/16000
a=rtpmap:126 telephone-event/8000
a=ssrc:3450648993 cname:eQ8ixcsdQ/576RWf
a=ssrc:3450648993 msid:ARDAMS ARDAMSa0
a=ssrc:3450648993 mslabel:ARDAMS
a=ssrc:3450648993 label:ARDAMSa0
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 127
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:GYAB
a=ice-pwd:bNJtuQXkD7eRYd9Nq8rqvg24
a=ice-options:trickle renomination
a=fingerprint:sha-256 6C:9A:98:1E:CB:80:6E:C5:DF:94:2B:3D:7E:3F:30:CB:14:BF:47:E5:BB:74:06:36:34:78:5E:61:39:79:06:65
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-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=sendrecv
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc x-google-max-bitrate=200;x-google-min-bitrate=100;x-google-start-bitrate=150
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 red/90000
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 ulpfec/90000
a=rtpmap:101 H264/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=fmtp:101 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:127 rtx/90000
a=fmtp:127 apt=101
a=ssrc-group:FID 2667975032 2642420444
a=ssrc:2667975032 cname:eQ8ixcsdQ/576RWf
a=ssrc:2667975032 msid:ARDAMS ARDAMSv0
a=ssrc:2667975032 mslabel:ARDAMS
a=ssrc:2667975032 label:ARDAMSv0
a=ssrc:2642420444 cname:eQ8ixcsdQ/576RWf
a=ssrc:2642420444 msid:ARDAMS ARDAMSv0
a=ssrc:2642420444 mslabel:ARDAMS
a=ssrc:2642420444 label:ARDAMSv0
m=application 9 DTLS/SCTP 5000
c=IN IP4 0.0.0.0
a=ice-ufrag:GYAB
a=ice-pwd:bNJtuQXkD7eRYd9Nq8rqvg24
a=ice-options:trickle renomination
a=fingerprint:sha-256 6C:9A:98:1E:CB:80:6E:C5:DF:94:2B:3D:7E:3F:30:CB:14:BF:47:E5:BB:74:06:36:34:78:5E:61:39:79:06:65
a=setup:actpass
a=mid:data
a=sctpmap:5000 webrtc-datachannel 1024
下面詳細(xì)的介紹一下比較常用的東西,但不會逐行來講,如果你有興趣逐行了解的話,可以點擊下面的鏈接:http://www.re2x.com/sdp-anatomy/
首先,SDP分為Offer和Answer,當(dāng)兩端PeerA,PeerB要進行連接時,PeerA首先會生成一個Offer,如上所示,用來描述自己的信息和所具有能力
RTCSessionDescription:
offer
這里面的offer就代表這個SDP是一個offer,對應(yīng)的,PeerB返回來的叫做Answer。
下面我們找到這一行:
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 102 0 8 106 105 13 110 112 113 126
這行表示的是,本地所具有的編碼能力。m=audio表示是對媒體為音頻的描述,9表示的是SRTP端口,UDP/TLS/RTP/SAVPF表示傳輸中用到的協(xié)議。后面的才是我們真正關(guān)心的,111 103 104 9 102 0 8 106 105 13 110 112 113 126表示本地支持的編碼格式,也就是RTP有效負(fù)載(RTP payload)。每一個數(shù)字代表一種支持的編碼格式,進行SDP協(xié)商時,會按照這個編碼列表的先后順序進行協(xié)商,也就是說,越在前面的編碼格式優(yōu)先級越高。對應(yīng)的,每一個編碼格式在下面都會有一個a=rtpmap:行來描述RTP Payload編號映射到具體的編碼名稱。同時還有a=fmtp:行來指定編碼格式參數(shù)。如下:
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
111映射過來就死opus編碼,a=fmtp:這一行是對opus編碼參數(shù)的設(shè)置,下文來講。對應(yīng)的,你可以看到103 104 對應(yīng)ISAC,8対應(yīng)PCMA。
這里講一下a=fmtp:參數(shù)設(shè)置,這里講音頻的,下面會講到視頻:
音頻參數(shù)主要包括音頻碼率,音頻采樣率,聲道。a=fmtp:111 maxaveragebitrate=2000;maxplaybackrate=16000;minptime=10;sprop-maxcapturerate=16000;sprop-stereo=1;stereo=1;useinbandfec=1
方法中maxaveragebitrate為音頻碼率, maxplaybackrate為采樣率,minptime為最小幀時間。
同理,m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 127是對視頻的編碼設(shè)置,在這里,你可以指定是使用H264編碼還是使用VP8編碼。如96代表VP8編碼,101代表H264編碼,如果你要指定編碼方式為VP8就將96放在前面,指定H264,就將101放在前面。
另外,我們可以通過SDP指定碼率。我們知道,如果SDP中沒有限制碼率的話,webRTC默認(rèn)音頻的最大碼率為512,視頻的最大碼率為2M。
SDP設(shè)置碼率有兩種方式,一種是使用B=AS:來指定最大碼率,一種是通過a=rtcp-fb:96 transport-cc x-google-max-bitrate=200;x-google-min-bitrate=100;x-google-start-bitrate=150。后者可定義最大碼率,最小碼率,和初始碼率。
比如我們現(xiàn)在要限制VP8編碼的碼率,我們找到這一行:
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc x-google-max-bitrate=200;x-google-min-bitrate=100;x-google-start-bitrate=150
a=rtpmap:97 rtx/90000
當(dāng)然我們也可以用B=AS方式,直接在需要限制的編碼方式前,或者m=video行下面,添加一行B=AS:2000就可以了。
下面要說的是a=ssrc:,它表示的是對音視頻數(shù)據(jù)源的描述,如下:
a=ssrc:3450648993 cname:eQ8ixcsdQ/576RWf
a=ssrc:3450648993 msid:ARDAMS ARDAMSa0
a=ssrc:3450648993 mslabel:ARDAMS
a=ssrc:3450648993 label:ARDAMSa0
我們比較關(guān)心的msid和label。比如當(dāng)一個stream里有多個audioTrack和VideoTrack時,例如一個videoTrack來自攝像頭采集,一個videoTrack來自本地視頻文件,那么,我們可以設(shè)置不同的id和label加以區(qū)分,這樣,在接收端就可知道哪個流是做什么的了。
另外,如果當(dāng)你本地設(shè)置不發(fā)送音頻流或者視頻流時,對應(yīng)的ssrc就會是空,也就是SDP中沒有對應(yīng)的音頻或者視頻的ssrc項。
下面說一下SDP中與數(shù)據(jù)傳輸有關(guān)的信息(非音視頻數(shù)據(jù)):
c=IN IP4 0.0.0.0 //0.0.0.0表示使用ICE
m=application 9 DTLS/SCTP 5000 //傳輸使用DTLS/SCTP協(xié)議
a=sctpmap:5000 webrtc-datachannel 1024 //使用DataChannel
WebRTC使用RTCDataChannel進行數(shù)據(jù)傳輸(非音視頻數(shù)據(jù)),RTCDataChannel采用SCTP協(xié)議,SCTP是一種TCP、UDP同級的傳輸協(xié)議,基于DTLS協(xié)議,并在其上添加特定的要求,以保證可靠性和有序性。0.0.0.0表示使用ICE。
哈勒,SDP目前就想到這么多,以后想到了就再補充。f