SDP详细介绍

SDP简介

SDP 代表会话描述协议。它用于以参与者通过网络理解的格式描述多媒体会话。根据该描述,一方决定是否加入会议或何时或如何加入会议。

  • 会议的所有者通过发送包含会话描述的多播消息在网络上做广告,例如所有者的名称、会话的名称、编码、时间等。根据这些信息,广告的接收者就参加会议作出决定。

  • SDP 通常包含在通常称为 SIP 的会话发起协议的主体部分中。

  • SDP 在 RFC 2327 中定义。SDP 消息由一系列称为字段的行组成,其名称由单个小写字母缩写,并按所需的顺序排列以简化解析。

 Session description (会话名称和意图描述)
         v=   (protocol version)    #协议版本
         o=   (owner/creator and session identifier)   #所有者/创建者和会话标识符
         s=   (session name)  #会话名称
         i=* (session information)  #会话信息
         u=* (URI of description)  #URI 描述
         e=* (email address) #Email 地址
         p=* (phone number) #电话号码
         c=* (connection information - not required if included in all media)  #连接信息 ― 如果包含在所有媒体中,则不需要该字段
         b=* (zero or more bandwidth information lines)  #带宽信息
One or more time descriptions ("t=" and "r=" lines, see below)
         z=* (time zone adjustments)  # 时区调整
         k=* (encryption key)  # 加密密钥  k=已定义的方法有:  k=clear:<加密密钥>密钥没有变换;k=base64:<编码密钥>已编码,因为它含有SDP禁用的字符;k=uri:<获得密钥的URI>;k=prompt。SDP没有提供密钥但该会话或媒体流是要求加密的。
         a=* (zero or more session attribute lines)
Zero or more media descriptions

Time description  # 时间描述
         t=   (time the session is active)  # 会话活动时间
         r=* (zero or more repeat times) # 0或多次重复次数

Media description, if present # 媒体描述
         m=   (media name and transport address)  # 媒体名称和传输地址
         i=* (media title)  # 媒体标题
         c=* (connection information - optional if included at  session-level)  # 连接信息 — 如果包含在会话层则该字段可选
         b=* (zero or more bandwidth information lines) #带宽信息
         k=* (encryption key) # 加密密钥
         a=* (zero or more media attribute lines)  #0 个或多个会话属性

字段描述

version

v= 字段包含 SDP 版本号。因为 SDP 的当前版本是 0,所以有效的 SDP 消息总是以 v = 0 开头。

origion

o= 字段包含有关会话发起者和会话标识符的信息。该字段用于唯一标识会话。

样例:o=00000 0 0 IN IP4 192.168.9.5
o=<username> <sessionid> <version> <network type> <address type> <address>
o=<用户名> <session id> <会话版本> <网络类型><地址类型> <地址>
  • username
    用户的登录名如果主机不支持< username>,则为 -。注意:< username>不能含空格。
  • session id
    是一个数字串。在整个会话中,必须是唯一的。为了确保其唯一,建议使用NTP(Network Time - Protocol)timestamp。
  • version
    该会话公告的版本,供公告代理服务器检测同一会话的若干个公告哪个是最新公告.基本要求是会话数据修改后该版本值递增,建议用NTP时戳。
  • networktype
    网络类型,一般为IN,表示”internet”
  • address type
    地址类型,一般为IP4
  • address
    地址

session name

表示本sdp所描述的session的名称,没有的话使用-代替,在整个会话中有且只有一个s=。

  • 可选的 i= 字段包含有关会话的信息。它可以包含任意数量的字符。
  • 可选的 u= 字段包含一个统一资源指示符 (URI),其中包含有关会话的更多信息
  • 可选的 e= 字段包含会话主机的电子邮件地址。
  • 可选的 p= 字段包含电话号码。

connection data

表示媒体连接信息。一个会话声明中,会话级描述中必须有”c=”项或者在每个媒体级描述中有一个”c=”项。可能在会话级描述和每个媒体级描述中都有”c=”项。其中值域中以空格分配的两个字段分贝是网络类型和网络地址,以后的RTP流就会发到该地址上。

样例:c=IN IP4 192.168.99.53
c=<networktype> <address type> <connection address>
  • network type
    网络类型,一般为IN,表示”internet”
  • address type
    地址类型,一般为IP4。
  • connection address
    应用程序必须处理域名和ip地址两种情形。单播时,为域名或IP地址,推荐使用域名;多播,为IP地址,且IP后面必须有TTL(取值范围是0-255),地址和TTL决定了多播包被传播的范围。

bandwidth

可选的 b= 字段包含有关所需带宽的信息。它的形式是 -b=修饰符:带宽 - 值。

b=:

包括两种CT和AS。CT:总带宽。AS:单个媒体带宽的最大值。扩展机制:以”X-”开始。建议bwtype越短越好。例b=X-YZ:128

times, repeattimesand time zones

t= 字段包含会话的开始时间和停止时间。

t=<start time> <stop time>
  • 可选的 r= 字段包含有关可以在 NTP 或天 ( d )、小时 ( h ) 或分钟 ( m ) 中指定的重复时间的信息。在时间表示里面可以如下表示:
r=<repeat-interval> <active duration> <offsets from start-time>
d - days (86400 seconds)
h - hours (3600 seconds)
m - minutes (60 seconds)
s - seconds (allowed for completeness)
  • 可选的z = 字段包含有关时区偏移的信息。如果正在发生的会话跨越从夏令时到标准时间的变化,则使用此字段,反之亦然。

media announcements

可选的m = 字段包含有关媒体会话类型的信息。该字段包含 -m=媒体端口传输格式列表。媒体参数是音频、视频、文本、应用程序、消息、图像或控件。port 参数包含端口号。传输参数包含使用的传输协议或 RTP 配置文件。
格式列表包含有关媒体的更多信息。通常,它包含在 RTP 音频视频配置文件中定义的媒体负载类型。

m=<media> <port> <transport> <fmt list>
  • media

表示媒体类型。有"audio", “video”,“application”, “data”和"control"。

  • port

媒体流发往传输层的端口。取决于c=行规定的网络类型和接下来的传输层协议:对UDP为1024-65535;对于RTP为偶数。当分层编码流被发送到一个单播地址时,需要列出多个端口。对于RTP,偶数端口被用来传输数据,奇数端口用来传输RTCP包。
下面样例中49170和49171为第一对RTP/RTCP端口,49172和49173为第二对的端口。传输协议是RTP/AVP,媒体格式为31(媒体格式是rtp头中payload参数对应的)。

样例:
m=video 49170/2 RTP/AVP 31
  • transport

传输协议,与c=行的地址类型有关。两种:RTP/AVP和UDP

  • fmt list

媒体格式。对于音频和视频就是在RTP Audio/Video Profile定义的负载类型(payload type)。但第一个为缺省值。

媒体格式分为静态绑定和动态绑定:

静态绑定即媒体编码方式与RTP流中的PayloadType(载荷类型)一一对应。u_law的PCM编码单信道Audio,采样率8KHZ。在RTPAudio/Video profile中对应的payload type为0。即: `

样例:
m=audio 49232 RTP/AVP 0

动态绑定即媒体编码方式(如时钟频率,音频信道数等)没有完全确定,动态编码都大于95,并且需要在后面使用“a=rtpmap”进行说明。16位线形编码,采样率为16KHZ,假如我们希望动态RTP/AVP 类型98表示此此流,写法如下:

样例:
m=video49232 RTP/AVP 98
a=rtpmap:98 L16/16000/2

attribute

会话属性

  • a=cat 给出点分层次式会话分类号,供接收方筛选会话
  • a=keywds 供接收方筛选会话
  • a=tool 创建会话描述的工具名和版本号
  • a=recvonly/sendrecv/sendonly 收发模式
  • a=type 有:广播,聚会,主席主持,测试,H.323
  • a=charset 显示会话名和信息数据的字符集
  • a=sdplang 描述所有语言
  • a=lang 会话描述的缺省语言或媒体描述的语言
  • a=framerate 1s播放RTP包的数量,framerate:50(1byte,8000HZ,20ms)则每个RTP包的音频数据量为160B,时间戳增值为160
  • a=quality 视频的建议质量(10/5/0)

媒体属性

  • a=ptime 媒体分组的时长(单位:秒)
  • a=recvonly/sendrecv/sendonly 收发模式
  • a=orient 指明白板在屏莫上的方向
  • a=sdplang 描述所有语言
  • a=lang 会话描述的缺省语言或媒体描述的语言

rtpmap

rtpmap是rtp与map的结合, 即RTP参数映射表。对于音频流,<编码参数>说明了音频的通道数。通道数默认缺省值为1。对于视频流,现阶段没有<编码参数>。

a=rtpmap:<payload type> <encoding name>/<clock rate>[/<encodingparameters>]
a=rtpmap:<负载类型> <编码名>/<时钟速率>[/<编码参数>]
  • payload type: 负载类型, 对应RTP包中的音视频数据负载类型.
  • encoding name: 编码器名称, 如VP8, VP9, OPUS.
  • clock rate: 采样率.
  • encodingparameters: 编码参数, 如音频是否是双声道, 通道数默认缺省值为1(单声道)。
m=audio 49230 RTP/AVP 96 97 98 
a=rtpmap:96 L8/8000 
a=rtpmap:97 L16/8000
a=rtpmap:98 L16/11025/2

m=audio 8888 RTP/AVP 0 
a=rtpmap:0 pcma/8000/1 

m=video 1234 RTP/AVP 96
a=rtpmap:96 H264

rtpmap在双向通话的场景中,可以为 recvonly,sendrecv,sendonly和inactive。这些值表示媒体流的双向保持设定(双向保持,即A 保持 B, B保持A)。

如果请求某媒体流的方向为sendonly,那么响应中对应媒体的方向必须为recvonly;
如果请求某媒体流的方向为recvonly,那么响应中对应媒体的方向必须为sendonly;
如果请求某媒体流的方向为sendrecv,那么响应中对应媒体的方向可以为sendrecv/sendonly/recvonly/inactive中的一种;
如果请求某媒体流的方向为inactive,那么响应中对应媒体的方向必须为inactive;

fmtp

样例:
a=fmtp:<payload type> <format specific parameters>
  • payload type
    负载类型
  • format specific parameters
    具体参数

具体示例:

//sdp版本号,一直为0,rfc4566规定
v=0 

// o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
//username如何没有使用-代替,7017624586836067756是整个会话的编号,2代表会话版本,如果在会话
//过程中有改变编码之类的操作,重新生成sdp时,sess-id不变,sess-version加1
o=- 7017624586836067756 2 IN IP4 127.0.0.1

//会话名,没有的话使用-代替
s=-

//两个值分别是会话的起始时间和结束时间,这里都是0代表没有限制
t=0 0

//需要共用一个传输通道传输的媒体,如果没有这一行,音视频,数据就会分别单独用一个udp端口来发送
a=group:BUNDLE audio video data

//WMS是WebRTC Media Stream简称,这一行定义了本客户端支持同时传输多个流,一个流可以包括多个track,
//一般定义了这个,后面a=ssrc这一行就会有msid,mslabel等属性
a=msid-semantic: WMS h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C

//m=audio说明本会话包含音频,9代表音频使用端口9来传输,但是在webrtc中一现在一般不使用,如果设置为0,代表不
//传输音频,UDP/TLS/RTP/SAVPF是表示用户来传输音频支持的协议,udp,tls,rtp代表使用udp来传输rtp包,并使用tls加密
//SAVPF代表使用srtcp的反馈机制来控制通信过程,后台111 103 104 9 0 8 106 105 13 126表示本会话音频支持的编码,后台几行会有详细补充说明
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126

//这一行表示你要用来接收或者发送音频使用的IP地址,webrtc使用ice传输,不使用这个地址
c=IN IP4 0.0.0.0

//用来传输rtcp地地址和端口,webrtc中不使用
a=rtcp:9 IN IP4 0.0.0.0

//以上两行是ice协商过程中的安全验证信息
a=ice-ufrag:khLS
a=ice-pwd:cxLzteJaJBou3DspNaPsJhlQ

//以上这行是dtls协商过程中需要的认证信息
a=fingerprint:sha-256 FA:14:42:3B:C7:97:1B:E8:AE:0C2:71:03:05:05:16:8F:B9:C7:98:E9:60:43:4B:5B:2C:28:EE:5C:8F3:17

//以上这行代表本客户端在dtls协商过程中,可以做客户端也可以做服务端,参考rfc4145 rfc4572
a=setup:actpass

//在前面BUNDLE这一行中用到的媒体标识
a=mid:audio

//上一行指出我要在rtp头部中加入音量信息,参考 rfc6464
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level

//上一行指出我是双向通信,另外几种类型是recvonly,sendonly,inactive
a=sendrecv

//指出rtp,rtcp包使用同一个端口来传输
a=rtcp-mux

//说明opus编码支持使用rtcp来控制拥塞
//对opus编码可选的补充说明,minptime代表最小打包时长是10ms,useinbandfec=1代表使用opus编码内置fec特性
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1

//下面几行都是对m=audio这一行的媒体编码补充说明,指出了编码采用的编号,采样率,声道等
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/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:126 telephone-event/8000

//cname用来标识一个数据源,ssrc当发生冲突时可能会发生变化,但是cname不会发生变化,也会出现在rtcp包中SDEC中,
//用于音视频同步
a=ssrc:18509423 cname:sTjtznXLCNH7nbRw

//定义了ssrc和WebRTC中的MediaStream,AudioTrack之间的关系,msid后面第一个属性是stream-d,第二个是track-id
a=ssrc:18509423 msid:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C 15598a91-caf9-4fff-a28f-3082310b2b7a
a=ssrc:18509423 mslabel:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C
a=ssrc:18509423 label:15598a91-caf9-4fff-a28f-3082310b2b7a
m=video 9 UDP/TLS/RTP/SAVPF 100 101 107 116 117 96 97 99 98

//参考上面m=audio,含义类似
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:khLS
a=ice-pwd:cxLzteJaJBou3DspNaPsJhlQ
a=fingerprint:sha-256 FA:14:42:3B:C7:97:1B:E8:AE:0C2:71:03:05:05:16:8F:B9:C7:98:E9:60:43:4B:5B:2C:28:EE:5C:8F3:17
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-hol ... de-cc-extensions-01
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=sendrecv
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:100 VP8/90000

//ccm是codec control using RTCP feedback message简称,意思是支持使用rtcp反馈机制来实现编码控制,fir是Full Intra Request
//简称,意思是接收方通知发送方发送幅完全帧过来
a=rtcp-fb:100 ccm fir

//支持丢包重传,参考rfc4585
a=rtcp-fb:100 nack

//支持关键帧丢包重传,参考rfc4585
a=rtcp-fb:100 nack pli

//支持使用rtcp包来控制发送方的码流
a=rtcp-fb:100 goog-remb

//参考上面opus
a=rtcp-fb:100 transport-cc
a=rtpmap:101 VP9/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=rtpmap:107 H264/90000
a=rtcp-fb:107 ccm fir
a=rtcp-fb:107 nack
a=rtcp-fb:107 nack pli
a=rtcp-fb:107 goog-remb
a=rtcp-fb:107 transport-cc

//h264编码可选的附加说明
a=fmtp:107 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f

//fec冗余编码,一般如果sdp中有这一行的话,rtp头部负载类型就是116,否则就是各编码原生负责类型
a=rtpmap:116 red/90000

//支持ULP FEC,参考rfc5109
a=rtpmap:117 ulpfec/90000

//以上两行是VP8编码的重传包rtp类型
a=rtpmap:96 rtx/90000
a=fmtp:96 apt=100
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=101
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=107
a=rtpmap:98 rtx/90000
a=fmtp:98 apt=116

//在webrtc中,重传包和正常包ssrc是不同的,上一行中前一个是正常rtp包的ssrc,后一个是重传包的ssrc
a=ssrc-group:FID 3463951252 1461041037

a=ssrc:3463951252 cname:sTjtznXLCNH7nbRw
a=ssrc:3463951252 msid:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C ead4b4e9-b650-4ed5-86f8-6f5f5806346d
a=ssrc:3463951252 mslabel:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C
a=ssrc:3463951252 label:ead4b4e9-b650-4ed5-86f8-6f5f5806346d
a=ssrc:1461041037 cname:sTjtznXLCNH7nbRw
a=ssrc:1461041037 msid:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C ead4b4e9-b650-4ed5-86f8-6f5f5806346d
a=ssrc:1461041037 mslabel:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C
a=ssrc:1461041037 label:ead4b4e9-b650-4ed5-86f8-6f5f5806346d
m=application 9 DTLS/SCTP 5000
c=IN IP4 0.0.0.0
a=ice-ufrag:khLS
a=ice-pwd:cxLzteJaJBou3DspNaPsJhlQ
a=fingerprint:sha-256 FA:14:42:3B:C7:97:1B:E8:AE:0C2:71:03:05:05:16:8F:B9:C7:98:E9:60:43:4B:5B:2C:28:EE:5C:8F3:17
a=setup:actpass
a=mid:data
a=sctpmap:5000 webrtc-datachannel 1024

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大张哥儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值