iOS webRTC SDP介绍及设置

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

  • IP address(这里指外网IP地址)
  • Port number(端口号)
  • Media type(媒体类型,包括音频,视频,白板等)
  • Media encoding scheme(媒体编码方案,常见的如视频的H264,VP8;音频的OPUS,ISAC等)

当然,还有一些关于建立连接的一些信息,包括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目前就想到这么多,以后想到了就再补充。f

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352

推荐阅读更多精彩内容