WebRTC -- SDP格式解析

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

技术支持QQ群:782508536

1 SDP组成

SDP是由多行文本组成的一个纯文本协议,如果将SDP从语义上分解成不同组件来描述一个多媒体会话信息,那么SDP由以下部分组成:

  • 会话信息
  • 网络信息
  • 媒体信息
  • 安全信息
  • 服务质量和分组信息

                                                 +---------------------+
                                                 |        v=           |
                                                 +---------------------+
                 +---------------------+         +---------------------+
         ====    |   Session Metadata  |  =====  |        o=           |
         |       +---------------------+         +----------------------
         |                                       +---------------------+
         |                                       |        t=           |
         |                                       +---------------------+
         |
         |
         |                                       +---------------------+
         |                                       |        c=           |
         |                                       +---------------------+
         |       +---------------------+
         ====    | Network Description |   =====
         |       +---------------------+
         |                                       +---------------------+
         |                                       |    a=candidate      |
         |                                       +---------------------+
         |
         |
         |                                       +---------------------+
         |                                       |        m=           |
         |                                       +---------------------+
         |        +---------------------+        +---------------------+
         ====     | Stream Description  |  ===== |      a=rtpmap       |
         |        +---------------------+        +----------------------
         |                                       +---------------------+
         |                                       |      a=fmtp         |
         |                                       +---------------------+
         |                                       +---------------------+
         |                                       |      a=sendrecv..   |
         |                                       +---------------------+
 +---------------+
 |    SEMANTIC   |
 | COMPONENTS OF |
 |     SDP       |
 +---------------+
         |                                       +---------------------+
         |                                       |      a=crypto       |
         |                                       +---------------------+
         |         +---------------------+       +---------------------+
         ====      |Security Descriptions|  =====|      a=ice-frag     |
         |         +---------------------+       +----------------------
         |                                       +---------------------+
         |                                       |      a=ice-pwd      |
         |                                       +---------------------+
         |                                       +---------------------+
         |                                       |     a=fingerprint   |
         |                                       +---------------------+
         |
         |
         |
         |                                       +---------------------+
         |                                       |      a=rtcp-fb      |
         |                                       +---------------------+
         |         +---------------------+       +---------------------+
         ====      |   Qos,Grouping      |       |                     |
                   |   Descriptions      |  =====|       a=group       |
                   +---------------------+       +----------------------
                                                 +---------------------+
                                                 |       a=rtcpmux     |
                                                 +---------------------+

2 SDP格式

SDP由多行组成,每行的的格式如下:

<type>=<value>
  • <type>: 区分大小写,代表特定的属性,例如v代表SDP版本。
  • <value>:UTF8编码的文本,具体格式与类型有关。
  • =两边不允许存在空格。
  • =*表示该项是可选的。

下面是WebRTC(branch_76)的一个真实SDP样本:

// -------------------------------- 【Session Metadata部分】 -------------------------------- 

// sdp版本号
v=0

// o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
// username如何没有使用-代替,3967017503571418851是整个会话的编号,2代表会话版本,如果在会话过程中有改变编码之类的操作,重新生成sdp时,sess-id不变,sess-version加1
o=- 3967017503571418851 2 IN IP4 127.0.0.1

//会话名
s=-

// 会话的起始时间和结束时间,0代表没有限制
t=0 0

// 表示需要共用一个传输通道传输的媒体,通过ssrc进行区分不同的流。如果没有这一行,音视频数据就会分别用单独udp端口来发送.
a=group:BUNDLE audio video

// WMS是WebRTC Media Stream简称;
// 这一行定义了本客户端支持同时传输多个流,一个流可以包括多个track.
// 一般定义了这个,后面a=ssrc这一行就会有msid,mslabel等属性.
a=msid-semantic: WMS stream_id


// -------------------------------- 【Stream Description部分】 -------------------------------- 

// ------------ audio部分 -------------

// m意味着它是一个媒体行.
// m=audio说明本会话包含音频,9代表音频使用端口9来传输,但是在webrtc中现在一般不使用,如果设置为0,代表不传输音频,
// UDP/TLS/RTP/SAVPF是表示用户支持来传输音频的协议,udp,tls,rtp代表使用udp来传输rtp包,并使用tls加密
// SAVPF代表使用srtcp的反馈机制来控制通信过程
// 后面的111 103 104 9 102 0 8 106 105 13 110 112 113 126表示本会话音频支持的编码,后面几行会有详细补充说明.
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 102 0 8 106 105 13 110 112 113 126

// 表示你要用来接收或者发送音频使用的IP地址.
// webrtc使用ice传输,不使用这个地址
c=IN IP4 0.0.0.0

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

// 下面2行是ice协商过程中的安全验证信息
a=ice-ufrag:kSq0
a=ice-pwd:pWLGrCTwFNq6rm249ZEasHPY

// 通知对端支持trickle,即sdp里面描述媒体信息和ice候选项的信息可以分开传输
a=ice-options:trickle

// dtls协商过程中需要的认证信息
a=fingerprint:sha-256 A0:D6:B2:63:1B:69:0E:91:01:C3:88:A9:92:6F:E7:EF:5B:36:52:66:08:DF:94:A0:FE:0C:C9:06:BF:2C:38:A2

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

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

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

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

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

// 下面十几行都是对m=audio这一行的媒体编码补充说明,指出了编码采用的编号,采样率,声道等
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
// 下面一行对opus编码可选的补充说明,minptime代表最小打包时长是10ms,useinbandfec=1代表使用opus编码内置fec特性
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:103 ISAC/16000
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
// cname用来标识一个数据源,ssrc当发生冲突时可能会发生变化,但是cname不会发生变化,也会出现在rtcp包中SDEC中,用于音视频同步
a=ssrc:2603526440 cname:AyMDWB+q6ApWdpfU
a=ssrc:2603526440 msid:stream_id audio_label
a=ssrc:2603526440 mslabel:stream_id
a=ssrc:2603526440 label:audio_label



// ------------ video部分 -------------

m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 127
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:kSq0
a=ice-pwd:pWLGrCTwFNq6rm249ZEasHPY
a=ice-options:trickle
a=fingerprint:sha-256 A0:D6:B2:63:1B:69:0E:91:01:C3:88:A9:92:6F:E7:EF:5B:36:52:66:08:DF:94:A0:FE:0C:C9:06:BF:2C:38:A2
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=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=sendrecv
a=rtcp-mux
a=rtcp-rsize
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
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=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=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 red/90000
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:127 ulpfec/90000
a=ssrc-group:FID 1563406656 4103641903
a=ssrc:1563406656 cname:AyMDWB+q6ApWdpfU
a=ssrc:1563406656 msid:stream_id video_label
a=ssrc:1563406656 mslabel:stream_id
a=ssrc:1563406656 label:video_label
a=ssrc:4103641903 cname:AyMDWB+q6ApWdpfU
a=ssrc:4103641903 msid:stream_id video_label
a=ssrc:4103641903 mslabel:stream_id
a=ssrc:4103641903 label:video_label

2.1 协议版本

第一行v=0定义了sdp协议的版本号。

2.2 会话发起者

第二行

o=- 3967017503571418851 2 IN IP4 127.0.0.1

定义了会话发起者的信息,格式如下:

o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
  • username:发起者的用户名,不允许存在空格,如果应用不支持用户名,则为-。
  • sess-id:会话id,由应用自行定义,SDP规范建议使用NTP(Network Time Protocol)时间戳。
  • sess-version:会话版本,用途由应用自行定义,只要会话数据发生变化时(比如编码)sess-version随着递增即可。SDP规范建议使用NTP时间戳。
  • nettype:网络类型,比如IN表示Internet。
  • addrtype:地址类型,比如IP4、IV6
  • unicast-address:域名,或者IP地址。

2.3 会话名

s=<session name>

必选,有且仅有一个s=字段,且不能为空。可以赋一个空格(即s=),或者-。

2.4 连接信息

c=<nettype> <addrtype> <connection-address>

每个SDP至少需要包含一个会话级别的c=字段,或者在每个媒体描述后面各包含一个c=字段,(媒体描述后的c=会覆盖会话级别的c=)。例如,在上面的示例SDP样本中,就不存在会话级别的连接信息。

  • nettype:网络类型,比如IN,表示 Internet。
  • addrtype:地址类型,比如IP4、IP6。
  • connection-address:如果是广播,则为广播地址组;如果是单播,则为单播地址;

2.4.1 何为会话级别和媒体级别

会话级部分以v =行开始,到第一个媒体级部分结束。
每个媒体级部分以m =行开始,持续到下一个媒体级(即下一个m=)。

2.5 媒体描述信息

SDP可以同时包含多个媒体描述信息(如音频、视频等),格式如下:

m=<media> <port> <proto> <fmt> ...

示例:

m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 102 0 8 106 105 13 110 112 113 126
c=IN IP4 0.0.0.0
  • media:媒体类型,包括 video、audio、text、application、message等。
  • port:传输媒体流使用的端口,具体含义取决于使用的网络类型(在c=中声明)和使用的传输协议(proto)。
  • proto:传输协议,具体含义取决于c=中定义的地址类型,比如c=IP4,那么这里的传输协议运行在IP4之上。
  • fmt:媒体格式的描述,可能有多个。根据proto的不同,fmt的含义也不同。比如proto为 RTP/SAVP 时,fmt 表示RTP payload 的类型。如果有多个,表示在这次会话中,多种payload类型可能会用到,且第一个为默认的payload类型。
    数字0-95是静态负载类型;96-127是动态负载类型,需要在后面使用附近属性a =
    rtpmap
    :指定具体的格式参数。具体的每个数字代表的负载类型和含义可以参考:Real-Time Transport Protocol (RTP) Parameters
    如上例中的audio类型的111表示使用opus编码。

2.6 附加属性

附加属性用于扩展SDP,有2种作用范围:会话级别、媒体级别:

  • 媒体级别:媒体描述(m=)后面可以跟任意数量的 a= 字段,对媒体描述进行扩展。
  • 会话级别:在第一个媒体字段(media field)前,添加的 a= 字段是会话级别的。

有下面2种格式:

a=<attribute>
a=<attribute>:<value>

2.7 时间

用于声明会话的开始、结束时间,格式如下:

t=<start-time> <stop-time>

如果<stop-time>是0,表示会话没有结束的边界,但是需要在<start-time>之后会话才是活跃(active)的;如果<start-time>是0,表示会话是永久的。

原文地址:https://blog.csdn.net/china_jeffery/article/details/79991986

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

推荐阅读更多精彩内容

  • SDP协议 概述 SDP(会话描述协议),用于两个会话实体之间的媒体协商,并达成一致,属信令语言族,采用文本(字符...
    耦耦阅读 6,615评论 0 6
  • 原文地址:RFC3550 RTP 中文版 英文版原文:RFC3550英文版 - RTP: A Transport ...
    云上听风阅读 12,932评论 0 13
  • 一 概述: SDP目的就是在媒体会话中,传递媒体流信息,允许会话描述的接收者去参与会话。SDP基本上在intern...
    幽澜先生阅读 7,604评论 0 2
  • 第一部分:RTSP协议 一、RTSP协议概述 RTSP(Real-TimeStream Protocol )是一种...
    小鱼儿喜欢花无缺阅读 2,611评论 1 6
  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,588评论 0 15