SDP 是由会话级描述(session level description)和多个媒体级描述(media level description)组成,每个媒体层又分为媒体流描述、网络描述、安全描述和服务质量描述;
会话级描述:的作用域是整个会话,其位置是从 v= 行开始到第一个媒体描述为止;
媒体级:是对单个的媒体流进行描述,其位置是从 m= 行开始到下一个媒体描述(即下一个 m=)为止;
WebRTC 按功能将 SDP 划分成了五部分:
会话元数据SessionMetaData:v=;o=;t=;s=;
网络描述NetworkDescription:c=;a=candidata;
流描述StreamDescription:m=;a=rtpmap;a=fmtp;
安全描述SecurityDescription:a=crypto;a=ice-frag;a=ice-pwd;a=fingerprint;
服务质量描述QoS Grouping D:a=rtcp-fb;a=group;a=rtcpmux;
o=;origin line源行,描述会话发起者的信息;
s=;session namelline;描述会话名称;
t=;timing line 时长行;描述会话的起止时间;
注:v,o,s,t,m为必须的,其他项为可选。
v=0 版本号码,不包括次版本
//定义源的信息;会话过程中编码等改变,重新生成了SDP,sessid不变,sessVersion+1;
o=- 1953451665606728823 2 IN IP4 127.0.0.1
o=<username> <session id> <version> <network type> <address type> <address>
userName:不关心为”-“;
sessionId:数字串,在整个会话中,必须是唯一的,建议使用 NTP 时间戳;
Version:版本号码,每次会话数据修改后,该版本值会递增
netWorkType:internet
addressType:
Ip:
s=- //会话名,没有使用-代替
t=0 0 //会话起始时间 结束时间
a=group:BUNDLE audio video //需要共用一个传输通道的媒体,如果没有这一行,音视频数据就会分别单独用一个udp端口发送
a=msid-semantic: WMS 3xBDQdEHc //描述了MediaStream的id为3xBDQdEHc
m=audio 9 RTP/AVPF 111 103 104 9 102 0 8 106 105 13 110 112 113 126
m=<media> <port> <transport> <fmt list>:表示一个会话,在一个 SDP 中一般会有多个媒体描述.每个媒体描述以“m=”开始到下一个“m=”结束;
<media>:媒体类型,比如 audio/video 等;
<port>:端口;
<transport>:传输协议,UDP/TLS/RTP/SAVPF 表示使用 dtls/srtp 协议对数据加密传输。UDP/TLS:表明传输层是哟经TLS加密的UDP协议。RTP/SAVPF:表示UDP协议上运行的是安全的
带有反馈机制的RTP协议的音视频profile。
<fmt list>:媒体格式。对于RTP/AVP系列即为数据负载类型 (Payload Type) 列表;
// connect连接信息/本地将用于传输媒体流的IP,分别描述:网络协议、地址类型、连接地址,webrtc使用ice传输,所以后面的地址不被使用;
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=或 a=:表示属性,用于进一步描述媒体信息,a=有两个特别的属性类型,即rtpmap 和 fmtp
a=ice-ufrag:tVrp // ice-ufrag、ice-pwd 分别为ICE协商用到的认证信息,防止链接时被攻击;
a=ice-pwd:DxSkSmWn7fyb3R/ToCoPdrwW
// DTLS协商过程的指纹信息,和a=setup描述了DTLS的选项;
a=fingerprint:sha-256 7F:98:... //DTLS协商使用的证书是sha-256哈希值;
// 描述本端DTLS协商的角色,actpass表明本端是client端(发起DTLS请求),passive是server端(接受DTLS请求),actpass表明本端可以是client、server;
a=setup:actpass
DTLS是Datagram Transport Layer Security的缩写
DTLS是为UDP协议定制的TLS协议,是用来加密内容的,在WebRTC中是用来交换SRTP的密钥;
a=ice-options:trickle renomination ///描述本端支持的ICE选项;
a=mid:audio
// 描述本端支持哪些RTP extension header,以及各个extension header id;
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=sendrecv //描述mediaSection的方向,可以是recvonlky(只接受)、sendonly、sendrecv;
a=rtcp-mux //表示本端支持RTCP和RTP的链接复用;
a=rtpmap:<payload type> <encoding name>/<clock rate>[/<encodingparameters>];
rtpmap是rtp与map的结合,即 RTP 参数映射表。
payloadType :负载类型,对应 RTP 包中的音视频数据负载类型。
encodingName:编码器名称,如 VP8、VP9、OPUS 等。
clockRate:采样率,如音频的采样率频率 32000、48000 等。
encodingparameters:编码参数,如音频是否是双声道,默认为单声道;
a=rtpmap:111 opus/48000/2 payload类型为111的数据是opus编码的音频数据,采样率是48000,双声道;
a=rtcp-fb:111 transport-cc
a=fmtp:<payload type> <format specific parameters>
fmtp,格式参数,即 format parameters;
<payload type> ,负载类型,同样对应 RTP 包中的音视频数据负载类型;
<format specific parameters>指具体参数;
a=fmtp:111 minptime=10;useinbandfec=1 //minptime代表最小打包时长是10ms,useinbandfec=1代表使用opus编码内置fec特性
a=rtpmap:103 ISAC/16000 isac编码
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/8000
a=rtpmap:102 ILBC/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:110 telephone-event/48000
a=rtpmap:112 telephone-event/32000
a=rtpmap:113 telephone-event/16000
a=rtpmap:126 telephone-event/8000
a=ssrc:975895996 cname:p1rcSjJOKnd3ywke
a=ssrc:975895996 msid:3xBDQdEHc
a=ssrc:975895996 mslabel:3xBDQdEHc
a=ssrc:975895996 label:3xBDQdEHc
// 数据类型 port(没有实际作用) 传输协议 AVProfileFeedBack 数据格式列表(payload type)
m=video 9 RTP/AVPF 96 97 98 99 100 101 127 123 125 124
// connection line
c=IN IP4 0.0.0.0
// 描述rtcp使用的ip和端口(不是实际使用)
a=rtcp:9 IN IP4 0.0.0.0
//ice链接过程中的用户和密码,防止被攻击;
a=ice-ufrag:tVrp
a=ice-pwd:DxSkSmWn7fyb3R/ToCoPdrwW
//本端支持的ice选项
a=ice-options:trickle renomination
a=mid:video
//给出会话或媒体所用带宽,单位为kbit/s.(会议总带宽,表示所有地点所有媒体的总带宽),AS(应用特定最大带宽,表示一个地点单一媒体带宽)
b=AS:700
//描述本端支持哪些RTP extension header,以及各个extension header的id;
a=extmap:14 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:13 urn:3gpp:video-orientation
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://tools.ietf.org/html/draft-ietf-avtext-framemarking-07
a=extmap:9 http://www.webrtc.org/experiments/rtp-hdrext/color-space
//描述了流的方向,包括sendonly/recvonly/sendrecv/inactive
a=sendrecv
=============服务质量信息=============
// 本端支持RTCP和RTP的连接复用
a=rtcp-mux
//表明本端希望缩减RTCP协议所使用的流量;
a=rtcp-rsize
//RTP协议的payloadType 编码格式名称 clockRate(音频为采样率,视频为90000)
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb //使用谷歌的带宽评估
a=rtcp-fb:96 transport-cc //启动防拥塞
--ccm是codec control using RTCP feedback message简称,意思是支持使用rtcp反馈机制来实现编码控制,fir:full intra request,意思是接收方通知发送方发送幅完全帧过来--
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:98 H264/90000
a=rtcp-fb:98 goog-remb //表明使用RTCP反馈接收端的带宽估计信息,remb是Receiver Estimated Maximum Bitrate。goog:表明这个机制尚未标准化,只有谷歌实现;
a=rtcp-fb:98 transport-cc //表明使用发送端拥塞阻塞机制。
a=rtcp-fb:98 ccm fir //表明使用请求关键帧的机制。codec cintrol message和full intra refresh。
a=rtcp-fb:98 nack //使用丢包通知机制,Negative ACK。
a=rtcp-fb:98 nack pli //使用图像丢失通知机制,接收端丢失图像,发送端可能会发一个I帧;picture loss iindication.
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 H264/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:127 red/90000
a=rtpmap:123 rtx/90000
a=fmtp:123 apt=127
//fec冗余编码,一般如果sdp中有这一行的话,rtp头部负责负载类型就是100,否则就是各编码原生负责类型
a=rtpmap:125 ulpfec/90000 //支持ULP FEC
a=rtpmap:124 flexfec-03/90000
a=rtcp-fb:124 goog-remb
a=rtcp-fb:124 transport-cc
a=fmtp:124 repair-window=10000000
--ssrc和webRTC中的MediaStream,AudioTRack之间的关系,msid后面第一个属性是stream-id,第二个是track-id--
a=ssrc-group:FID 583783888 1397969457 ////FEC:前向纠错,SIM:用于simulcate, FID:流识别
a=ssrc-group:FEC-FR 583783888 2389950866
// ssrc用来对媒体进行描述,格式为a=ssrc:<ssrc-id> <attribute>:<value>
// cname用来标识一个数据源,ssrc当发生冲突时可能会发生变化,但是cname不会发生变化,也会出现在rtcp包中SDEC中,用于音视频同步;
a=ssrc:583783888 cname:p1rcSjJOKnd3ywke
// msid后面带两个id,第一个是MediaStream的id,第二个是audio track的id(跟后面的mslabel、label对应)
a=ssrc:583783888 msid:3xBDQdEHc
a=ssrc:583783888 mslabel:3xBDQdEHc
a=ssrc:583783888 label:3xBDQdEHc
a=ssrc:1397969457 cname:p1rcSjJOKnd3ywke
a=ssrc:1397969457 msid:3xBDQdEHc
a=ssrc:1397969457 mslabel:3xBDQdEHc
a=ssrc:1397969457 label:3xBDQdEHc
a=ssrc:2389950866 cname:p1rcSjJOKnd3ywke
a=ssrc:2389950866 msid:3xBDQdEHc
a=ssrc:2389950866 mslabel:3xBDQdEHc
a=ssrc:2389950866 label:3xBDQdEHc
a=StreamCount:integer;2 //用来描述媒体流的信息,表示有两个媒体流。integer表示信息的格式为整数。
a=cat:<category>分类,根据分类接收者隔离相应的会话
a=keywds:<keywords>关键字,根据关键字隔离相应的会话
a=tool:<name and version of tool>创建任务描述的工具的名称及版本号
a=ptime:<packet time>在一个包里面的以毫秒为单位的媒体长度
a=maxptime:<maximum packet time>以毫秒为单位,能够压缩进一个包的媒体量。
a=rtpmap:<payload type> <encoding name>/<clock rate> [/<encoding parameters>]
会话名 s= ISO 10646字符表示的会话名
会话信息 v= ISO 10646字符表示的会话信息
URI u= 能提供会议进一步信息的URI地址
E妹地址 e= 给出会议负责人的联系信息,他不一定是创建会议公告的人
电话号码 p= 给出会议负责人的联系信息,他不一定是创建会议公告的人(国际通用形式)
连接数据 c=媒体连接数据,会话级为媒体级的摸认值
带宽 b= 给出会话或媒体所用带宽,单位为kbit/s.修饰语:CT(会议总带宽,表示所有
地点所有媒体的总带宽),AS(应用特定最大带宽,表示一个地点单一媒体带宽)
时间描述 t= 见上
r= 见上
时区调整 z= 见上
加密密钥 k=已定义的方法有
k=clear:<加密密钥>密钥没有变换
k=base64:<编码密钥>已编码,因为它含有SDP禁用的字符
k=uri:<获得密钥的URI>
k=prompt。SDP没有提供密钥但该会话或媒体流是要求加密的。
属性 a=一个m=行可有多个a=行,SDP建议扩展如下:(具体见[1].Page419)
会话级: a=cat:<类别>//给出点分层次式会话分类号,供接收方筛选会话
a=keywds:<关键词>//供接收方筛选会话
a=tool:<工具名和版本号>//创建会话描述的工具名和版本号
a=recvonly/sendrecv/sendonly//收发模式
a=type:<会议类型>//有:广播,聚会,主席主持,测试,H.323
a=charset:<字符集>//显示会话名和信息数据的字符集
a=sdplang:<语言标记>//描述所有语言
a=lang:<语言标记>//会话描述的缺省语言或媒体描述的语言
a=framerate:<帧速率>//单位:帧/秒
a=quality:<质量>//视频的建议质量(10/5/0)
a=fmtp:<格式>< 格式特定参数>//定义指定格式的附加参数
媒体级:a=ptime:<分组时间>//媒体分组的时长(单位:秒)
a=recvonly/sendrecv/sendonly//收发模式
a=orient:<白板方向>//指明白板在屏莫上的方向
a=sdplang:<语言标记>//描述所有语言
a=lang:<语言标记>//会话描述的缺省语言或媒体描述的语言
媒体描述 m= <媒体>有5种类型:音频/视频/应用(如白板信息)/数据(不向用户显示的)/控制
<端口>媒体流发往传输层的端口。取决于c=行规定的网络类型和接下来的传
送层协议:对UDP为1024-65535;对分层编码应用(c=行没有多播地址),
要给出多播端口数,如:m=video 49170/2 RTP/AVP 31(表示:端口49170
和49171为第一对RTP/RTCP端口,49172和49173为第二对的端口)。
<传送层协议>与c=行的地址类型有关。对大多的媒体在RTP/UDP上传送,定
义2种:RTP/AVP:IETF RTP协议,音/视频应用文档。在UDP上传诵。
Udp:UDP协议。
<格式列表>对音/视频,就是音/视频应用文档中规定媒体净荷类型。列表中都
有可能用,但第一个为缺省值,分为静态绑定和动态绑定:静态绑定即使媒体编码方式有净荷类型号完全确定,动态绑定则媒体编码方式如时钟频率,音频信道数等)没有完全确定,需要进一步的属性说明。分别举例如下:
Alaw的PCM编码单信道Audio,其净荷类型号为8,把它发往UDP端口49232,则:m=audio 49232 RTP/AVP 8
16bit线性编码,双声道立体声,抽样速率16kHz,其动态净荷类型号98,则:m=audio 49232 RTP/AVP 98
a=rtpmap:98 L16/16000/2
说明:1)a=rtpmap:<净荷类型号><编码名>/<时钟速率>[/<编码参数>]
对音频,编码参数为音频信道数;对视频没有定义
2)SDP允许rtpmap规定实验性编码格式,但编码名必须以X-起,
表示此格式还没正式登记。
【自己平时记录的SDP说明,持续更新中,有不正确的地方欢迎指正】
网友评论