sdp书写规范 (sdp协议原理)

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

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格式:

由多个 = 组成

常见的会话描述有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作出一些详细的介绍。

字段含义(一)

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

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

字段含义(二)

Origion/Owner 必选:o=

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

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

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

Connection Data 可选

c=

例子:c= IN IP4 0.0.0.0

Media Announcements必须

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

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

m=<fmt/payload type list>

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

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

Suggested Attributes 可选

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

a= 或 a=:

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

rtpmap可选

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

a=rtpmap:<fmt/payload type>/[/]

例子: a = rtpmap:103 ISAC/16000

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

fmtp可选

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

a=fmtp:<format/payload type> parameters

例子:a=fmtp:103 apt=106

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

下期会跟大家分享基于Python3,接口自动化测试 及web平台开发的相关常用方法,敬请期待~

欢迎各位关注、留言,大家的支持就是我的动力!