WebRTC 中的 SDP 协议

课程地址:零声学院 WebRTC入门与提高 https://ke.qq.com/course/435382?tuin=137bb271

技术支持QQ群:782508536

简介

SDP 完全是一种会话描述格式 ― 它不属于传输协议 ― 它只使用不同的适当的传输协议,包括会话通知协议(SAP)、会话初始协议(SIP)、实时流协议(RTSP)、MIME 扩展协议的电子邮件以及超文本传输协议(HTTP)。SDP协议是也是基于文本的协议,这样就能保证协议的可扩展性比较强,这样就使其具有广泛的应用范围。SDP 不支持会话内容或媒体编码的协商,所以在流媒体中只用来描述媒体信息。媒体协商这一块要用RTSP来实现.

当发起多媒体电话会议,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=0
o=- 3925575362227037542 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio video
a=msid-semantic: WMS 735174861
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:KZ8M
a=ice-pwd:NZ1R3TFbpF9ZqEyg5PNSoM85
a=fingerprint:sha-256 7B:0B:B7:6C:C2:82:77:D2:70:18:3F:DD:18:98:AB:22:07:0E:5D:5B:6D:30:C0:05:42:50:C0:D7:53:AF:3E:9F
a=setup:active
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:889008008 cname:JQsS3I1VR6oT0wUw
a=ssrc:889008008 msid:735174861 6446c8d1-1db2-4024-b0bd-1e03304810fe
a=ssrc:889008008 mslabel:735174861
a=ssrc:889008008 label:6446c8d1-1db2-4024-b0bd-1e03304810fe
m=video 9 UDP/TLS/RTP/SAVPF 98 96 100 127 99 97 101
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:KZ8M
a=ice-pwd:NZ1R3TFbpF9ZqEyg5PNSoM85
a=fingerprint:sha-256 7B:0B:B7:6C:C2:82:77:D2:70:18:3F:DD:18:98:AB:22:07:0E:5D:5B:6D:30:C0:05:42:50:C0:D7:53:AF:3E:9F
a=setup:active
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:98 H264/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=fmtp:98 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
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:100 red/90000
a=rtpmap:127 ulpfec/90000
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=ssrc-group:FID 687692313 4175760292
a=ssrc:687692313 cname:JQsS3I1VR6oT0wUw
a=ssrc:687692313 msid:735174861 54bc6a42-f281-4d75-ac41-ab709717abdb
a=ssrc:687692313 mslabel:735174861
a=ssrc:687692313 label:54bc6a42-f281-4d75-ac41-ab709717abdb
a=ssrc:4175760292 cname:JQsS3I1VR6oT0wUw
a=ssrc:4175760292 msid:735174861 54bc6a42-f281-4d75-ac41-ab709717abdb
a=ssrc:4175760292 mslabel:735174861
a=ssrc:4175760292 label:54bc6a42-f281-4d75-ac41-ab709717abdb
"

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


a=group
需要共用一个传输通道传输的媒体,如果没有这一行,音视频,数据就会分别单独用一个udp端口来发送
在同一个RTP会话中多路复用几个媒体流,也就是在后面以”m =”开始的媒体段


a=msid-semantic
WMS是WebRTC Media Stream简称,这一行定义了本客户端支持同时传输多个流,一个流可以包括多个track。
在PeerConnection生命周期内为 WebRTC Media Stream (WMS) 定义一个唯一的标识符,用于确定其他独立的RTP媒体流(下面以”m = “开始的媒体段)属于该 WMS。
接下来是三个以 “m = “开始的媒体段,分别是audio、video、application。


m =
后面跟着四个参数
是媒体类型,包括audio, video, text, application, message
是发送媒体流的传输端口
是传输协议
是媒体格式说明,有效负载类型

有效负载类型可以看 这篇文档。其中0-95是静态负载类型,96-127是动态负载类型,需要使用”a = rtpmap:”属性指定格式参数。


m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126
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表示本会话音频支持的编码,后台几行会有详细补充说明


c=IN IP4 0.0.0.0
c 字段中包含了连接数据,但这一个地址不会被实际使用,只有 ICE 候选项中的 IP 地址和端口才会用于建立对话。


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


a=ice-ufrag
a=ice-pwd
指定了用于ICE的用户名片段和密码,不同的媒体段会使用不同的用户名和密码。


a=fingerprint
指纹是用于建立DTLS连接的自签名证书的SHA-256散列,这行是dtls协商过程中需要的认证信息


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


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


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


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


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

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
这里讲一下a=fmtp:参数设置,这里讲音频的
将有效负载111,即 Opus 数据包的最短分时时间设置为10ms,且使用in-band FEC(前向纠错编码)


a=rtcp-fb:111 transport-cc
以上这行说明opus编码支持使用rtcp来控制拥塞,参考https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01


a=rtcp-fb
反馈消息,接收方向发送方发送的反馈消息


a=ssrc
同步源标识符,用于在使用多个源时表示不同源的属性


a=extmap
RTP 扩展项,接收者可以自己解码获取里面的数据


a=rtcp-mux
支持对RTP的同一端口多路复用RTCP


b=
该属性在上面没有列出,可以自己添加
格式为<bwtype>:<bandwidth>
可以为CT或AS,CT是所有媒体的总带宽上限,AS是指定单个媒体的带宽


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


a=ssrc:18509423 msid:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C 15598a91-caf9-4fff-a28f-3082310b2b7a
以上这一行定义了ssrc和WebRTC中的MediaStream,AudioTrack之间的关系,msid后面第一个属性是stream-d,第二个是track-id


m=video 9 UDP/TLS/RTP/SAVPF 98 96 100 127 99 97 101
是对视频的编码设置,在这里,你可以指定是使用H264编码还是使用VP8编码。如96代表VP8编码,98代表H264编码,如果你要指定编码方式为VP8就将96放在前面,指定H264,就将98放在前面


a=rtpmap:98 H264/90000
每个codec都有类似的描述都有以下类似的描述


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


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


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


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


a=rtcp-fb:98 transport-cc
参考上面opus


注意

  1. 由于H264的rtp中不能区分视频流中是否每一帧的图像都连续,对于丢帧的情况无法处理,所以fec+nack会导致fec包丢失后,nack去申请重传fec的包.造成带宽的浪费。
  2. WebRTC对FEC的冗余度计算是动态的, 会根据丢包情况和网络带宽估计(BWE)的结果动态调整冗余度,
    内部会维护一个静态的冗余度表. 冗余度范围: 0-255.(255相当于100%冗余度)
  3. ULPFEC: Uneven Level Protection FEC.
    将需要保护的媒体流按照重要性分成若干区域(section),
    不同的区域使用不同的保护级别(levels),每个ulpfec可以携带多个级别的保护区域。

精读

音视频 RED 与 FEC 的 RTP 格式封装
什么是FEC/NACK/RTX /RED

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容