目录
一. 前言
二. 标准SDP规范说明
会话级描述
媒体级描述
三. WebRTC的SDP
会话描述
媒体信息描述
网络描述
安全描述
服务质量描述
四. 其他
一. 前言
SDP(Session Description Protocol) 是一种通用的会话描述协议,例如在音视频通话前通话双方需要进行媒体能力协商,比如协商双方都可支持的编解码类型,交换候选地址等,因此通话前都会发送一个 SDP,描述自己的会话和媒体等信息。
二. 标准SDP规范说明
标准 SDP 结构由会话级描述和多个媒体级描述组成,每条描述信息都是 key=value 的形式,key 可以为 v(版本),o(owner),s(会话),m(媒体信息),a(属性),c(连接)等,以如下的 SDP 会话描述信息说明各字段含义。
v=0
o=- 4007659306182774937 2 IN IP4 127.0.0.1
s=-
t=0 0
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126
...
a=rtpmap:111 opus/48000/2 //对RTP数据的描述
a=fmtp:111 minptime=10;useinbandfec=1 //对格式参数的描述
...
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 122 127 121 125 107 108 109 124 120 123 119 114 115 116
...
a=rtpmap:96 VP8/90000
...
会话级描述
版本描述:v=<protocol version>,v=0 表示 SDP 版本号
来源描述:o=<username> <sessionid> <version> <network type> <address type> <address>
username:用户名
sessionid:会话 ID
version:会话版本,每次会话描述信息修改,该值都会加一
network type:网络类型,IN 表示 Internet
address type:地址类型,IP4 表示 IPv4
address:客户端 IP
会话描述:s=<session name>,session name 表示会话名称,当不关心会话名称时可以填 -
时间描述:t=<start time> <stop time>,描述会话的开始时间和结束时间,如果希望持久会话则都填充为 0
媒体级描述
媒体描述:m=<media> <port> <transport> <fmt list>
media:audio / video
port:端口,通常不会被使用
transport:传输协议描述,如 UDP/TLS/RTP/SAVPF
fmt list:媒体数据负载列表
属性描述:a=<type>:<value>,用于进一步描述媒体属性信息,例如:
a=rtpmap:<payload type> <encoding name>/<clock rate>[/<encodingparameters>]
payload type:负载类型
encoding name:编码器名称,如 VP8,VP9,OPUS 等
clock rate:采样率
encodingparameters:编码参数,如音频的声道数信息
a=rtpmap:111 opus/48000/2,该设置表示 payload type=111 的数据类型为 opus,采样率为 48K,双声道。
a=fmtp:<payload type> <format specific parameters>
payload type:负载类型
format specific parameters:参数信息
a=fmtp:111 minptime=10;useinbandfec=1,例如该设置表示 payload type=111 的数据类型设置最小分包时间为 10ms,并开启 inbandfec 功能
三. WebRTC的SDP
WebRTC 对标准 SDP 规范进行调整,按功能分成会话描述和媒体描述,媒体描述包含媒体信息,网络描述,安全描述,服务质量描述。
以如下 SDP 会话描述信息说明各字段含义。
v=0 # SDP版本
o=- 125529219034078926 2 IN IP4 127.0.0.1 # 用户名 会话ID 会话版本 网络类型 IPv4 网络地址
s=- # 会话名
t=0 0 # 起始时间 结束时间
a=group:BUNDLE 0 1 # 表示0,1这一组媒体流绑定到一起,底层使用一个连接进行传输
a=msid-semantic: WMS EEZ1FKFsNMtehiuc7XvZm8krRnaIjJkszLK4 # 媒体流标识
# 音频,端口是9(特殊含义),底层UDP,上层RTP,使用TLS加密,payload type list(111 103 104 9 0 8 106 105 13 110 112 113 126)
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 # WebRTC的媒体信息也按照标准添加了conn的信息,但是没有使用
a=rtcp:9 IN IP4 0.0.0.0 # RTCP采用的端口,IP地址
# 以下几个是加密认证相关的,ice-ufrag相当于账号,ice-pwd相当于密码
a=ice-ufrag:d/Bq
a=ice-pwd:LCr5D75zcEz79NVpIeMwy7Fh
a=ice-options:trickle
a=fingerprint:sha-256 5C:6A:7E:73:AE:3E:51:1F:C5:1A:C4:7B:09:82:D1:A1:24:0E:F2:E9:9D:2D:2E:BB:16:EC:07:60:99:9F:D9:ED
# actpass/actpassive/active
a=setup:actpass
a=mid:0
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=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:6 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=sendrecv # 可以发送和接收
a=msid:EEZ1FKFsNMtehiuc7XvZm8krRnaIjJkszLK4 e98d20bd-a95d-4039-b4a7-0b0a274c781f
a=rtcp-mux # RTP和RTCP复用同一端口
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:2728451063 cname:CrzhiObmsWXG+XzP
a=ssrc:2728451063 msid:EEZ1FKFsNMtehiuc7XvZm8krRnaIjJkszLK4 e98d20bd-a95d-4039-b4a7-0b0a274c781f
a=ssrc:2728451063 mslabel:EEZ1FKFsNMtehiuc7XvZm8krRnaIjJkszLK4
a=ssrc:2728451063 label:e98d20bd-a95d-4039-b4a7-0b0a274c781f
# 视频,端口为9(特殊含义),底层UDP,上层RTP,使用TLS加密,payload type list(96 97 98 99 100 101 102 122 127 121 125 107 108 109 124 120 123 119 114 115 116)
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 122 127 121 125 107 108 109 124 120 123 119 114 115 116
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:d/Bq
a=ice-pwd:LCr5D75zcEz79NVpIeMwy7Fh
a=ice-options:trickle
a=fingerprint:sha-256 5C:6A:7E:73:AE:3E:51:1F:C5:1A:C4:7B:09:82:D1:A1:24:0E:F2:E9:9D:2D:2E:BB:16:EC:07:60:99:9F:D9:ED
a=setup:actpass
a=mid:1
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:12 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:11 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
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:6 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=sendrecv
a=msid:EEZ1FKFsNMtehiuc7XvZm8krRnaIjJkszLK4 aec72a07-57d7-4056-ae1f-82a08733eed2
a=rtcp-mux
a=rtcp-rsize # 带宽不足时减少RTCP非关键包的发送
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 # 支持nack反馈丢包信息
a=rtcp-fb:96 nack pli # 与ccm fir类似
a=rtpmap:97 rtx/90000 # 标识为重传包,使用的payload type不同
a=fmtp:97 apt=96 # payload type 97 关联 96,前者是后者的重传包
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 VP9/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 profile-id=2
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
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
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:122 rtx/90000
a=fmtp:122 apt=102
a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
a=rtpmap:121 rtx/90000
a=fmtp:121 apt=127
a=rtpmap:125 H264/90000
a=rtcp-fb:125 goog-remb
a=rtcp-fb:125 transport-cc
a=rtcp-fb:125 ccm fir
a=rtcp-fb:125 nack
a=rtcp-fb:125 nack pli
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=125
a=rtpmap:108 H264/90000
a=rtcp-fb:108 goog-remb
a=rtcp-fb:108 transport-cc
a=rtcp-fb:108 ccm fir
a=rtcp-fb:108 nack
a=rtcp-fb:108 nack pli
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108
a=rtpmap:124 H264/90000
a=rtcp-fb:124 goog-remb
a=rtcp-fb:124 transport-cc
a=rtcp-fb:124 ccm fir
a=rtcp-fb:124 nack
a=rtcp-fb:124 nack pli
a=fmtp:124 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d0032
a=rtpmap:120 rtx/90000
a=fmtp:120 apt=124
a=rtpmap:123 H264/90000
a=rtcp-fb:123 goog-remb
a=rtcp-fb:123 transport-cc
a=rtcp-fb:123 ccm fir
a=rtcp-fb:123 nack
a=rtcp-fb:123 nack pli
a=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640032
a=rtpmap:119 rtx/90000
a=fmtp:119 apt=123
a=rtpmap:114 red/90000 #冗余策略
a=rtpmap:115 rtx/90000
a=fmtp:115 apt=114
a=rtpmap:116 ulpfec/90000 #FEC冗余
a=ssrc-group:FID 2209548469 3569917101
a=ssrc:2209548469 cname:CrzhiObmsWXG+XzP
a=ssrc:2209548469 msid:EEZ1FKFsNMtehiuc7XvZm8krRnaIjJkszLK4 aec72a07-57d7-4056-ae1f-82a08733eed2
a=ssrc:2209548469 mslabel:EEZ1FKFsNMtehiuc7XvZm8krRnaIjJkszLK4
a=ssrc:2209548469 label:aec72a07-57d7-4056-ae1f-82a08733eed2
a=ssrc:3569917101 cname:CrzhiObmsWXG+XzP
a=ssrc:3569917101 msid:EEZ1FKFsNMtehiuc7XvZm8krRnaIjJkszLK4 aec72a07-57d7-4056-ae1f-82a08733eed2
a=ssrc:3569917101 mslabel:EEZ1FKFsNMtehiuc7XvZm8krRnaIjJkszLK4
a=ssrc:3569917101 label:aec72a07-57d7-4056-ae1f-82a08733eed2
会话描述
v,o,s,t 含义与 SDP 规范中的含义相同,不做赘述。
媒体信息描述
媒体信息描述主要由 rtpmap,fmtp 说明,与 SDP 规范中的媒体描述含义相同,不做赘述。
网络描述
a=candidate 描述了候选地址信息
a=ice-lite 表示使用 lite-ice,不使用 full-ice(full-ice 表示双方都要进行媒体连接探测,lite-ice 表示不需要主动探测候选者地址,只被动响应 STUN binding response)
a=rtcp-mux 表示 RTP 与 RTCP 复用同一端口进行多路传输
a=extmap 描述了使用的 RTP 扩展字段信息
a=rtcp-rsize 表示带宽不足时减少 RTCP 非关键包的发送
安全描述
a=ice-ufrag 表示 ICE 用户名
a=ice-pwd 表示 ICE 密码,与 ice-ufrag 一同用于 ICE 认证
a=fingerprint 表示 DTLS 握手时的证书指纹
a=setup:(active/actpass) 表示 DTLS 时作为主动握手方还是被动连接方
服务质量描述
a=rtcp-fb 描述了与服务质量相关的特性,例如 nack 表示支持丢包重传,fir 表示支持关键帧请求, transport-cc,goog-remb 描述了支持的带宽评估算法等。
Anatomy of a SDP 该网站提供了一个 webrtc SDP 的示例值,并详细描述了 webrtc SDP 每一行的含义。
四. 其他
WebRTC CreateOffer 源码剖析
最后
以上就是可耐小熊猫最近收集整理的关于会话描述协议-SDP一. 前言二. 标准SDP规范说明三. WebRTC的SDP四. 其他的全部内容,更多相关会话描述协议-SDP一.内容请搜索靠谱客的其他文章。
发表评论 取消回复