WebRTC 中的 SDP 协议

来源:互联网 发布:微软云计算认证考试 编辑:程序博客网 时间:2024/05/16 07:51

当发起多媒体电话会议,IP语音呼叫时,流媒体视频或其他会话,需要传达媒体细节,传输地址和其他会话描元数据给参与者。SDP 为此类信息提供了标准。SDP纯粹是会话描述的格式,它不包含传输协议。

WebRTC 会话就是由 SDP 描述的。对于 WebRTC 来说,最重要的是 SDP 中的媒体和传输信息。

媒体信息包括:

媒体类型(视频,音频)传输协议(RTP/UDP/IP,H.320等)媒体格式(H.261视频,MPEG视频等)

传输信息包括:

媒体的远程地址媒体的远程传输端口

该地址和端口取决于媒体和传输协议定义。但需要注意的是,因为存在网络地址转换(NAT)和防火墙,所以传输过程比较复杂,在 SDP 中没有定义相关的实现。WebRTC 中使用 ICE 协议来解决 NAT 的问题。

SDP 格式

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=0o=- 2584450093346841581 2 IN IP4 127.0.0.1s=-t=0 0a=group:BUNDLE audio video dataa=msid-semantic: WMS 616cfbb1-33a3-4d8c-8275-a199d6005549m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126c=IN IP4 0.0.0.0a=rtcp:9 IN IP4 0.0.0.0a=ice-ufrag:sXJ3a=ice-pwd:yEclOTrLg1gEubBFefOqtmyVa=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:79a=setup:actpassa=mid:audioa=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-levela=sendrecva=rtcp-muxa=rtpmap:111 opus/48000/2a=rtcp-fb:111 transport-cca=fmtp:111 minptime=10;useinbandfec=1a=rtpmap:103 ISAC/16000a=rtpmap:104 ISAC/32000a=rtpmap:9 G722/8000a=rtpmap:0 PCMU/8000a=rtpmap:8 PCMA/8000a=rtpmap:106 CN/32000a=rtpmap:105 CN/16000a=rtpmap:13 CN/8000a=rtpmap:110 telephone-event/48000a=rtpmap:112 telephone-event/32000a=rtpmap:113 telephone-event/16000a=rtpmap:126 telephone-event/8000a=ssrc:120276603 cname:iSkJ2vn5cYYubTvea=ssrc:120276603 msid:616cfbb1-33a3-4d8c-8275-a199d6005549 1da3d329-7399-4fe9-b20f-69606bebd363a=ssrc:120276603 mslabel:616cfbb1-33a3-4d8c-8275-a199d6005549a=ssrc:120276603 label:1da3d329-7399-4fe9-b20f-69606bebd363m=video 9 UDP/TLS/RTP/SAVPF 96 98 100 102 127 97 99 101 125c=IN IP4 0.0.0.0a=rtcp:9 IN IP4 0.0.0.0a=ice-ufrag:sXJ3a=ice-pwd:yEclOTrLg1gEubBFefOqtmyVa=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:79a=setup:actpassa=mid:videoa=extmap:2 urn:ietf:params:rtp-hdrext:toffseta=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-timea=extmap:4 urn:3gpp:video-orientationa=extmap:5 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delaya=sendrecva=rtcp-muxa=rtcp-rsizea=rtpmap:96 VP8/90000a=rtcp-fb:96 ccm fira=rtcp-fb:96 nacka=rtcp-fb:96 nack plia=rtcp-fb:96 goog-remba=rtcp-fb:96 transport-cca=rtpmap:98 VP9/90000a=rtcp-fb:98 ccm fira=rtcp-fb:98 nacka=rtcp-fb:98 nack plia=rtcp-fb:98 goog-remba=rtcp-fb:98 transport-cca=rtpmap:100 H264/90000a=rtcp-fb:100 ccm fira=rtcp-fb:100 nacka=rtcp-fb:100 nack plia=rtcp-fb:100 goog-remba=rtcp-fb:100 transport-cca=fmtp:100 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01fa=rtpmap:102 red/90000a=rtpmap:127 ulpfec/90000a=rtpmap:97 rtx/90000a=fmtp:97 apt=96a=rtpmap:99 rtx/90000a=fmtp:99 apt=98a=rtpmap:101 rtx/90000a=fmtp:101 apt=100a=rtpmap:125 rtx/90000a=fmtp:125 apt=102a=ssrc-group:FID 2580761338 611523443a=ssrc:2580761338 cname:iSkJ2vn5cYYubTvea=ssrc:2580761338 msid:616cfbb1-33a3-4d8c-8275-a199d6005549 bf270496-a23e-47b5-b901-ef23096cd961a=ssrc:2580761338 mslabel:616cfbb1-33a3-4d8c-8275-a199d6005549a=ssrc:2580761338 label:bf270496-a23e-47b5-b901-ef23096cd961a=ssrc:611523443 cname:iSkJ2vn5cYYubTvea=ssrc:611523443 msid:616cfbb1-33a3-4d8c-8275-a199d6005549 bf270496-a23e-47b5-b901-ef23096cd961a=ssrc:611523443 mslabel:616cfbb1-33a3-4d8c-8275-a199d6005549a=ssrc:611523443 label:bf270496-a23e-47b5-b901-ef23096cd961m=application 9 DTLS/SCTP 5000c=IN IP4 0.0.0.0a=ice-ufrag:sXJ3a=ice-pwd:yEclOTrLg1gEubBFefOqtmyVa=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:79a=setup:actpassa=mid:dataa=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

参数为 <payload type> <encoding name> / <clock rate> [/ <encoding parameters>]

对于 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=

该属性在上面没有列出,可以自己添加

格式为<bwtype>:<bandwidth>

可以为CT或AS,CT是所有媒体的总带宽上限,AS是指定单个媒体的带宽

原创粉丝点击