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