当发起多媒体电话会议,IP语音呼叫时,流媒体视频或其他会话,需要传达媒体细节,传输地址和其他会话描元数据给参与者。SDP 为此类信息提供了标准。SDP纯粹是会话描述的格式,它不包含传输协议。
WebRTC 会话就是由 SDP 描述的。对于 WebRTC 来说,最重要的是 SDP 中的媒体和传输信息。
媒体信息包括:
媒体类型(视频,音频)
传输协议(RTP/UDP/IP,H.320等)
媒体格式(H.261视频,MPEG视频等)
传输信息包括:
媒体的远程地址
媒体的远程传输端口
该地址和端口取决于媒体和传输协议定义。但需要注意的是,因为存在网络地址转换(NAT)和防火墙,所以传输过程比较复杂,在 SDP 中没有定义相关的实现。WebRTC 中使用 ICE 协议来解决 NAT 的问题。
SDP会话描述是由多行文本组成表格。由会话级部分(session-level)和多个媒体级(media-level)部分组成。会话级部分以”v =”行开始,到第一个媒体级部分结束。每个媒体级部分以”m =”行开始,持续到下一个媒体级。
下面是所有的字段描述,可选项目标有”*”。
会话描述
v =(协议版本)
o =(发起者和会话标识符)
s =(会话名称)
i = *(会话信息)
u = *(描述的URI)
e = *(电子邮件地址)
p = *(电话号码)
c = *(连接信息 - 如果包含在内,则不需要所有媒体)
b = *(零个或多个带宽信息行)
一个或多个时间描述("t ="和"r ="行;见下文)
z = *(时区调整)
k = *(加密密钥)
a = *(零个或多个会话属性行)零个或多个媒体描述
时间描述
t =(会话活动时间)
r = *(零个或多个重复次数)
媒体描述,如果存在
m =(媒体名称和传输地址)
i = *(媒体标题)
c = *(连接信息 - 如果包含在内,则为可选项会话级别)
b = *(零个或多个带宽信息行)
k = *(加密密钥)
a = *(零个或多个媒体属性行)
下面是一个基本的 SDP 描述:
v=0
o=- 2584450093346841581 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio video data
a=msid-semantic: WMS 616cfbb1-33a3-4d8c-8275-a199d6005549
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:sXJ3
a=ice-pwd:yEclOTrLg1gEubBFefOqtmyV
a=fingerprint:sha-256 22:14:B5:AF:66:12:C7:C7:8D:EF:4B:DE:40:25:ED:5D:8F:17:54:DD:88:33:C0:13:2E:FD:1A:FA:7E:7A:1B:79
a=setup:actpass
a=mid:audio
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=sendrecv
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
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:110 telephone-event/48000
a=rtpmap:112 telephone-event/32000
a=rtpmap:113 telephone-event/16000
a=rtpmap:126 telephone-event/8000
a=ssrc:120276603 cname:iSkJ2vn5cYYubTve
a=ssrc:120276603 msid:616cfbb1-33a3-4d8c-8275-a199d6005549 1da3d329-7399-4fe9-b20f-69606bebd363
a=ssrc:120276603 mslabel:616cfbb1-33a3-4d8c-8275-a199d6005549
a=ssrc:120276603 label:1da3d329-7399-4fe9-b20f-69606bebd363
m=video 9 UDP/TLS/RTP/SAVPF 96 98 100 102 127 97 99 101 125
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:sXJ3
a=ice-pwd:yEclOTrLg1gEubBFefOqtmyV
a=fingerprint:sha-256 22:14:B5:AF:66:12:C7:C7:8D:EF:4B:DE:40:25:ED:5D:8F:17:54:DD:88:33:C0:13:2E:FD:1A:FA:7E:7A:1B:79
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-holmer-rmcat-transport-wide-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:96 VP8/90000
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtpmap:100 H264/90000
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=fmtp:100 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:102 red/90000
a=rtpmap:127 ulpfec/90000
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:125 rtx/90000
a=fmtp:125 apt=102
a=ssrc-group:FID 2580761338 611523443
a=ssrc:2580761338 cname:iSkJ2vn5cYYubTve
a=ssrc:2580761338 msid:616cfbb1-33a3-4d8c-8275-a199d6005549 bf270496-a23e-47b5-b901-ef23096cd961
a=ssrc:2580761338 mslabel:616cfbb1-33a3-4d8c-8275-a199d6005549
a=ssrc:2580761338 label:bf270496-a23e-47b5-b901-ef23096cd961
a=ssrc:611523443 cname:iSkJ2vn5cYYubTve
a=ssrc:611523443 msid:616cfbb1-33a3-4d8c-8275-a199d6005549 bf270496-a23e-47b5-b901-ef23096cd961
a=ssrc:611523443 mslabel:616cfbb1-33a3-4d8c-8275-a199d6005549
a=ssrc:611523443 label:bf270496-a23e-47b5-b901-ef23096cd961
m=application 9 DTLS/SCTP 5000
c=IN IP4 0.0.0.0
a=ice-ufrag:sXJ3
a=ice-pwd:yEclOTrLg1gEubBFefOqtmyV
a=fingerprint:sha-256 22:14:B5:AF:66:12:C7:C7:8D:EF:4B:DE:40:25:ED:5D:8F:17:54:DD:88:33:C0:13:2E:FD:1A:FA:7E:7A:1B:79
a=setup:actpass
a=mid:data
a=sctpmap:5000 webrtc-datachannel 1024
a=group
在同一个RTP会话中多路复用几个媒体流,也就是在后面以”m =”开始的媒体段
a=msid-semantic
在PeerConnection生命周期内为 WebRTC Media Stream (WMS) 定义一个唯一的标识符,用于确定其他独立的RTP媒体流(下面以”m = “开始的媒体段)属于该 WMS。
接下来是三个以 “m = “开始的媒体段,分别是audio、video、application。
m =
后面跟着四个参数
是媒体类型,包括audio, video, text, application, message
是发送媒体流的传输端口
是传输协议
是媒体格式说明,有效负载类型
有效负载类型可以看 这篇文档。其中0-95是静态负载类型,96-127是动态负载类型,需要使用”a = rtpmap:”属性指定格式参数。
c=IN IP4 0.0.0.0
c 字段中包含了连接数据,但这一个地址不会被实际使用,只有 ICE 候选项中的 IP 地址和端口才会用于建立对话。
a=ice-ufrag
a=ice-pwd
指定了用于ICE的用户名片段和密码,不同的媒体段会使用不同的用户名和密码。
a=fingerprint
指纹是用于建立DTLS连接的自签名证书的SHA-256散列。
a = rtpmap
参数为
对于 a=rtpmap:111 opus/48000/2 ,就是对应”m =”中的有效负载111,使用Opus编解码器,采样频率48kHz,立体声。
一般每个媒体段会有多条”a=rtpmap”字段,位于前面的编解码器具有较高的优先级。
a=fmtp:111 minptime=10;useinbandfec=1
将有效负载111,即 Opus 数据包的最短分时时间设置为10ms,且使用in-band FEC(前向纠错编码)
a=rtcp-fb
反馈消息,接收方向发送方发送的反馈消息
a=ssrc
同步源标识符,用于在使用多个源时表示不同源的属性
a=extmap
RTP 扩展项,接收者可以自己解码获取里面的数据
a=rtcp-mux
支持对RTP的同一端口多路复用RTCP
b=
该属性在上面没有列出,可以自己添加
格式为
可以为CT或AS,CT是所有媒体的总带宽上限,AS是指定单个媒体的带宽