添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

开始之前先思考一个问题,比如用户A支持H.264、VP8、VP9编码,那和他连接的用户B怎么知道A有支持哪些编码呢?这个时候就需要使用到SDP来交换这些信息。

什么是SDP

SDP(Session Description Protocol) 会话描述协议,基于文本,其本身并不属于传输协议,需要依赖其它的传输协议来交换必要的媒体信息,用于两个会话实体之间的媒体协商。 首先我们先来看一个SDP的片段

v=0
o=- 4862894269795654845 2 IN IP4 127.0.0.1
t=0 0
a=group:BUNDLE 0 1
a=extmap-allow-mixed
a=msid-semantic: WMS qlhXYLhVBYP3xmE7zDSX04khWee5jguaORsU
m=audio 9 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:13 CN/8000
a=rtpmap:110 telephone-event/48000
a=rtpmap:126 telephone-event/8000
m=video 9 UDP/TLS/RTP/SAVPF 96 97 102 103 104 105 106 107 108 109 127 125 39 40 45 46 98 99 100 101 112 113 114 115 116
c=IN IP4 0.0.0.0
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:102 H264/90000
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 transport-cc
a=rtcp-fb:102 ccm fir
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli

如上所示,我们看到了一个m=audio和m=video,以视频为例,m=video后面有一串的数字,这个是代表视频支持的Payload,包括96、97、102...等。下面的片段又对96、97、102做了更详细的描述,例如96使用的是VP8编码的视频数据,时钟频率是90000,下面的是H264。

交互SDP的目的就是让连接的双方知道对方有哪些能力,根据大家都有的能力进行协商得到对应的编码参数,编码器等。

SDP的格式

通过上面的例子,我们已经初步的看到了一些格式,SDP是由多行的type=value组成的,其中type表示类型,value的格式由type决定,区分大小写,“=”两边不能有空格。 SDP的结构由会话级描述和媒体信息描述两个部分组成。 媒体信息描述又包括了

会话级描述是从“v=”一直到“m=xxx”,之间的信息都是会话描述。媒体描述是对单个的媒体流进行描述的,从“m=xxx”到下一个“m=xxx”都是一个媒体描述。

一个SDP是由一个会话级描述和多个媒体级描述组成的。

那现在我们知道了SDP的结构是什么,那接下来就介绍一下SDP的结构和字段的意义。

SDP的结构

由于会话描述的字段比较多,我们就按照上面的例子来介绍一下对应的字段

1.version(必选)

格式: v=<version>

描述: 表示sdp的版本号,不包含次版本号

2.origin(必选)

格式:o=<username> <sessionid> <version> <network type> <address type> <address>

  • o=选项对会话的发起者进行了描述.
  • <username>:是用户的登录名, 如果主机不支持username,则用"-"代替,username不能包含空格
  • <session id>:是一个数字串,在整个会话中,必须是唯一的,建议使用个NTP 时间戳;
  • <version>: 版本号,每次会话数据修改后,该版本值会递增
  • <network type>: 网络类型,一般为"IN",表示internet
  • <address type>: 地址类型,一般为IP4或IP6
  • <adress>: IP地址
  • 3.Session Name(必选)

  • 格式:s=
  • 会话名称,在整个会话中有且只有1个"s="

    4.Timing (必选)

    格式:t=<start time> <stop time>

    描述:t字段描述了指定会话的开始和停止时间,<start time> <stop time>为NTP时间,单位是秒;如果<stop time>为0表示过了<start time>之后,会话一直持续;当<start time> 和<stop time>都为0的时候,表示持久会话.

    5.Attributes(可选)

    格式 :a=<*>

    描述:表示一个会话级别或媒体级别下的0个或多个属性

    1.media name and transport address

    格式:m=<media> <port> <proto> <fmt> ...

  • media: 媒体类型如,audio/video/text 等
  • prot:端口
  • proto:协议,传输协议,有三种
  • UDP:表示在UDP上运行的未指定协议。
  • RTP/AVP:表示在RTP配置文件下使用的RTP。
  • RTP/SAVP:表示在UDP上运行的安全实时传输协议
  • fmt:媒体格式描述
  • 2.a=xxx(zero or more media attribute lines)

    属于扩展SDP,范围可以是会话级的也可以是当前的媒体级的,这里面的value有非常多,需要介绍一下rtpmap和fmtp

    1. rtpmap
  • 格式:a=rtpmap:<payload type> <encoding name>/<clock rate> [/<encoding parameters>]
  • paayload type: 负载类型,对应 RTP 包中的音视频数据负载类型。如96为VP8。
  • encoding name:编码名称。 如 VP8、VP9、OPUS、H.264 等。
  • clock rate:表示时钟频率,如90000。
  • encoding parameters:编码参数,如音频是否是双声道【可选】
  • 2.fmtp
  • 格式:a=fmtp:<format> <format specific parameters>
  • format:负载类型
  • format specific parameters:扩展参数、
  • WebRTC对SDP规范的修改

    实际上在WebRTC上面的SDP信息是对规范有了一定的修改和调整的,它将SDP按功能分成了五大块。

    这里是一张描述图

  • Session Metadata:会话元数据
  • Network Description:网络描述
  • Stream Description:流媒体描述
  • Security Descriptions:安全描述
  • Qos,Grouping Descriptions :qos,分组描述
  • 我们可以看看新增的安全描述和qos描述

    //安全描述
    a=ice-ufrag:NDyv
    a=ice-pwd:StyQquQftgbN7DlVc+c03JTH
    a=ice-options:trickle
    a=fingerprint:sha-256 83:60:87:58:77:85:B1:A5:24:0D:BF:6D:E1:8F:E0:92:F1:AD:2F:FB:55:AB:AC:06:16:8B:F8:38:42:30:FC:2F
    // qos描述
    a=rtcp-fb:106 goog-remb 
    a=rtcp-fb:106 transport-cc
    a=rtcp-fb:106 ccm fir
    a=rtcp-fb:106 nack // 丢包重传
    a=rtcp-fb:106 nack pli
    

    通过本文可以对SDP的一些概念有了基本的了解,对于学习和了解WebRTC,记住这些属性是必备的。

  • www.ietf.org/archive/id/…
  • www.rfc-editor.org/rfc/rfc4566
  •