多媒体开发stomp webSocket kurento xmppaudio and vidio

iOS webRTC SDP介绍及设置

2018-11-21  本文已影响3人  王沐凡

今天说说webRTC中的Session Description Protocol (SDP,会话描述协议)。
SDP是一系列信息的描述,包括

当然,还有一些关于建立连接的一些信息,包括Offer/Answer,Candidate,以及启停信息,下面都会一一讲到。

SDP描述由许多文本行组成,文本行的格式为 <类型>= <值>, <类型>是一个字母, <值>是结构化的文本串,其格式依 <类型>而定。

常见的比如m代表media,m=audio表示此行描述的是音频信息相关,m=video代表此行描述的是视频信息相关。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

下面详细的介绍一下比较常用的东西,但不会逐行来讲,如果你有兴趣逐行了解的话,可以点击下面的链接:http://www.re2x.com/sdp-anatomy/

首先,SDP分为Offer和Answer,当两端PeerA,PeerB要进行连接时,PeerA首先会生成一个Offer,如上所示,用来描述自己的信息和所具有能力

RTCSessionDescription:
offer

这里面的offer就代表这个SDP是一个offer,对应的,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表示传输中用到的协议。后面的才是我们真正关心的,111 103 104 9 102 0 8 106 105 13 110 112 113 126表示本地支持的编码格式,也就是RTP有效负载(RTP payload)。每一个数字代表一种支持的编码格式,进行SDP协商时,会按照这个编码列表的先后顺序进行协商,也就是说,越在前面的编码格式优先级越高。对应的,每一个编码格式在下面都会有一个a=rtpmap:行来描述RTP Payload编号映射到具体的编码名称。同时还有a=fmtp:行来指定编码格式参数。如下:

a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1

111映射过来就死opus编码,a=fmtp:这一行是对opus编码参数的设置,下文来讲。对应的,你可以看到103 104 对应ISAC,8対应PCMA。

这里讲一下a=fmtp:参数设置,这里讲音频的,下面会讲到视频:
音频参数主要包括音频码率,音频采样率,声道。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是对视频的编码设置,在这里,你可以指定是使用H264编码还是使用VP8编码。如96代表VP8编码,101代表H264编码,如果你要指定编码方式为VP8就将96放在前面,指定H264,就将101放在前面。

另外,我们可以通过SDP指定码率。我们知道,如果SDP中没有限制码率的话,webRTC默认音频的最大码率为512,视频的最大码率为2M。
SDP设置码率有两种方式,一种是使用B=AS:来指定最大码率,一种是通过a=rtcp-fb:96 transport-cc x-google-max-bitrate=200;x-google-min-bitrate=100;x-google-start-bitrate=150。后者可定义最大码率,最小码率,和初始码率。
比如我们现在要限制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

当然我们也可以用B=AS方式,直接在需要限制的编码方式前,或者m=video行下面,添加一行B=AS:2000就可以了。

下面要说的是a=ssrc:,它表示的是对音视频数据源的描述,如下:

a=ssrc:3450648993 cname:eQ8ixcsdQ/576RWf
a=ssrc:3450648993 msid:ARDAMS ARDAMSa0
a=ssrc:3450648993 mslabel:ARDAMS
a=ssrc:3450648993 label:ARDAMSa0

我们比较关心的msidlabel。比如当一个stream里有多个audioTrack和VideoTrack时,例如一个videoTrack来自摄像头采集,一个videoTrack来自本地音频文件,那么,我们可以设置不同的id和label加以区分,这样,在接收端就可知道哪个流是做什么的了。
另外,如果当你本地设置不发送音频流或者视频流时,对应的ssrc就会是空,也就是SDP中没有对应的音频或者视频的ssrc项。

下面说一下SDP中与数据传输有关的信息(非音视频数据):

c=IN IP4 0.0.0.0  //0.0.0.0表示使用ICE
m=application 9 DTLS/SCTP 5000 //传输使用DTLS/SCTP协议
a=sctpmap:5000 webrtc-datachannel 1024 //使用DataChannel

WebRTC使用RTCDataChannel进行数据传输(非音视频数据),RTCDataChannel采用SCTP协议,SCTP是一种TCP、UDP同级的传输协议,基于DTLS协议,并在其上添加特定的要求,以保证可靠性和有序性。0.0.0.0表示使用ICE。

哈勒,SDP目前就想到这么多,以后想到了就再补充。

上一篇下一篇

猜你喜欢

热点阅读