在现实世界中,我们知道寄快递,你首先知道对方和标识发送方的地址,姓名,联系方式等,这些快递才能寄出去,那么在webrtc的世界中,双方或者 多方通信是怎么联系的呢?就是通过SDP这样的一个东西,他里面包含着各种各样的丰富的信息。你要通信你首先得产生个SDP,就像你要泡妞,最好就是先知道人家女孩的微信一样。

首先我们得知道SDP是个啥玩意?他的英文名称就叫做session description protocol,说点人话就是叫做会议描述格式,是用来描述流媒体初始化参数的格式,说白了也就是个信令,就好比你寄个东西,你得知道收件的人的地址,电话,叫啥,对方也得知道是哪个二百五给他发的东西,发东西人的电话,这个SDP就是类似于这么一个东西。

 

SDP规范

SDP的规范比较简单,他分两层,第一层是会话层,这玩意是什么意思呢?写过程序的都知我们有个东西叫全局变量,当我们的局总变量没有设置的时候,全局变更就生效了,当我们的函数内部设置了局部变量,那么函数内的局部变量就会覆盖掉全局变量,SDP的会话层就是那么个东西相当于全局变量这么一个东西,第二层次就是媒体层,媒体层就相当于我们的一个个函数,用SDP的不是人话的意思就是一个个媒体,比如一个音频流,一个视频流。每一路音频,每一路视频都是一个媒体层。那么会话层是全局的,那么在你媒体层没有设置的时候,会话层的影响就会到了媒体层,如果你媒体层设置了你自己的描述,那么就肯定得按照你自己设置的来走,你可以把SDP想象成一棵大树,会话层就是根,媒体层就是那些树干。

会话层包括会话的名称与目的,存活时间,这个存活时间稍微有点用,你设置多少分钟就是多少分钟,但是对于我们的音视频流来说一般是设置为0,表明不限时。也就是说整个会话一直存在。会话中包括多个媒体信息。

媒体信息包括:

媒体格式,这是说明你的流是视频还是音频还是混合的,还是其他数据。

传输协议,你使用啥协议,是IPV4,或者IPV6,是用TCP还是UDP

传输IP和端口:你具体使用的IP地址和端口,当然对于WEBRTC来说,具体的IP和端口应该是在ICE那里描述,而不是在SDP中描述的,所以在SDP中的IP地址和端口信息,价值不大的。但对于基他的非WEBRTC使用的SDP就有意义啦。

媒体负载类型:你是人VP8还是VP9,X264等等都在这里。

简单的就是这些,复杂的是实际上我们可以针对媒体类型进行不同属性的设置。在这属性里头进行更细致的规范。

SDP格式:

由多个 <type> = <value> 组成 

常见的会话描述有Session Description

v = (protoclo version) , v就是版本号,一般都是设置为0

o =(owner/create and session iddentifer) ,o就是定义来源的信息

s =(session name)  ,s就是会话的名称

c = *(conn info – optional if included at session-level) ,c就是连接的信息,分别描述了网络协议,地址类型,连接地址

a = *(zero or more session attribute lines),  a就是设置一些全局的属性

这些就是会话层的格式,一般意义不大,要知道基本含义就可以了,一般都是每个媒体就自己设置好了。

 

Time Description: 时间的描述

t=(time the session is active),t就是存活的时间

r= *(zero or more repeat times),r就是重复的次数

上边两个也是了解就可以了。

 

Media Description: 媒体描述

这个媒体层的相关描述就比较重要了

m =(media name and transport address),m代表媒体的名字,传输地址

c= *(conn info – optional if included at session-level),c连接信息

b=*(banwidth information),b代表带宽的描述

a=*(zero or more session attribute lines),a是媒体层的一些相关属性细节,这是整个媒体层最为复杂的设置。有机会的话,本光头将对这个a作出一些详细的介绍。

 

字段含义(一)

1. Version是必选的, v=0 SDP的版本号,不包括次版本号

2. Session name必须的, s=<session name>会话名, s=-表示忽略会话名,所以有了这个设置之后,我们开发的时候,遇到临时会议的场景就很好使了。

 

字段含义(二)

1. Origion/Owner 必选: o=<username><session id><version><network type><addresstype><address>

这个就是描述这个流隶属哪个人的,用户名,会话id,版本,网络类型,地址类型,地址

例子:其中 -表示用户名可以忽略

o=- 7012312345543211234554321 2 in IP4 127.0.0.1,这些其实都是些描述信息,大家是不用记住他的,了解一下就可以了。

 

2. Connection Data 可选

c=<network type><address type><connection address>

例子:c= IN IP4 0.0.0.0 

 

3. Media Announcements必须

这个是很重要的,大家要必须清楚了解,这是媒体相关的。

包括具体媒体类型,端口,传输类型,负载类型(vp8,vp9,x264等)。其中这个fmt/payload是负责将你的负责媒体类型交给解码器,编码器的,错了,就没法玩了。

m=<media><port><transport><fmt/payload type list>

例子: m=audtion 1024 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 103 105 13 126

红色部分代表着每一个媒体类型

 

4. Suggested Attributes 可选

a是作为属性值是可以有一堆的。

a=<TYPE> 或 a=<TYPE>:<VALUE>

例子: a=framerate:<帧速率>

 

 rtpmap可选

  rtpma是用来修饰payload的,对于不同的payload是需要对应的编解码器的,比如vp8,对应的一些编码的参数,下边的例子是一个音频的。    

 a=rtpmap:<fmt/payload type><encoding name>/<clokc rate>[/<encodingparameters>]                  

例子: a = rtpmap:103 ISAC/16000

说明103对应的是ISAC,采样率是16000

 

fmtp可选 

这也是一个比较重要的属性,关联payload type的对应参数

a=fmtp:<format/payload type> parameters

例子: a=fmtp:103 apt=106

以上就是SDP的一些简单的介绍,其实最重要的还是媒体层的东西,这东西大家现在看得云里雾去的,后面,本光头在SDP的详解篇章里面,将会具体介绍到这些东西的用法,有兴趣的朋友记得关注哦。