webrtc之SDP详解

566 阅读11分钟

上一篇介绍了 媒体协商,知道了它的作用就是用来传递双方的媒体信息。但是,具体有哪些媒体信息并没有说明。那么这节就来详细介绍下 媒体协商 过程中传递的媒体信息,也就是 SDP,到底有哪些内容。

这节内容纯纯硬货,没有任何感情和技巧。但只需要稍微了解一下就行,记是记不住的,只能划划水了。

SDP 由会话描述和媒体描述两个部分组成。一个 SDP 只有一个会话描述,但可以有多个媒体描述。

会话描述

一个SDP仅有一个会话描述,通常有以下15种类型的行。

  1. v= 行定义了 SDP 的版本
v=0
  1. o= 行定义了会话发起方的信息,它的格式如下:
o= <username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
  • <username> 该字段内容不能有空格,如果没有内容的话,则用 - 表示。
  • <sess-id> 是一个数值字符串,需要保证 <username> <sess-id> <nettype> <addrtype> <unicast-address>这5个字段拼起来后具有全局唯一性,可使用 UTC时间戳。
  • <sess-version> 是此会话的的版本号,也可以使用 UTC时间戳。
  • <nettype>IN 表示 Internet
  • <addrtype>IP4IP6,是IP的类型。
  • <unicast-address> 则是 ip地址。

一个o=的例子如下

o=- 5320411424692107684 2 IN IP4 127.0.0.1
  1. s= 行定义了会话的文本名称,每个会话都必须有一个名称,且只能有一个。如果实在没有,则会用 -来代替,比如:
s=-
  1. i=行则定义了会话的信息,是一个文本描述。每个会话描述、每个媒体描述都至多只有一个。
i= SDP Offer
  1. u= 行定义了一个URI,提供有关会话描述的额外信息或元数据。但在实际的 WebRTC 应用中,通常不需要使用这个字段,因为 SDP 本身已经包含了建立 WebRTC 连接所需的所有必要信息。大多数浏览器实现在生成 SDP 时也不会包含 u 字段。
u=http://example.com/meetings/videoconference1234.xml
  1. e= 行提供一个联系人的电子邮件地址,以便在需要时与会话相关人员取得联系。这个字段是可选的。
e=cxyi7@example.com
  1. p= 行用于指定与会话相关的电话号码,以便在需要时与会话相关人员取得联系。这个字段是可选的。
p=1008611
  1. c= 行用于指定连接信息,主要包括网络类型、地址类型和连接地址。它的格式如下
c=<network-type> <address-type> <connection-address>
  • <network-type> 指定网络类型,通常为 IN 表示互联网。
  • <address-type> 指定地址类型,如 IP4 表示 IPv4, IP6 表示 IPv6。
  • <connection-address> 指定连接地址,可以是 IP 地址或完全限定域名。

c行可以在会话级别或媒体级别使用。如果同时在两个级别出现,则媒体级别的值将覆盖会话级别的值。

c=IN IP4 192.0.2.1
  1. b= 行用于指定与会话或媒体相关的带宽信息,它的格式如下:
b=<modifier>:<bandwidth-value>
  • <modifier> 指定带宽类型,常见的有:

    • AS - 会话带宽
    • CT - 会话时间总带宽
    • TIAS - 传输独立应用程序的会话带宽
  • <bandwidth-value> 指定带宽值,单位是千比特每秒(kbit/s)

b行可以在会话级别或媒体级别使用。如果同时在两个级别出现,则媒体级别的值将覆盖会话级别的值。

v=0 
o=alice 2890844526 2890844526 IN IP4 host.example.com 
b=CT:1000 t=0 0 
m=audio 49170 RTP/AVP 0 
b=AS:64 
a=rtpmap:0 PCMU/8000

这里有两个b行,第一个表示会话级别的,b=CT:1000 在会话级别指定了会话时间总带宽为 1000kbit/s;第二个表示媒体级别的,b=AS:64 在媒体级别指定了音频媒体的应用程序特定最大带宽为 64kbit/s。

这个带宽信息还是挺重要的,假如你的带宽有限,那么则需要重点关注这部分。

  1. t= 行用于指定会话的活动时间范围。格式为t=<start-time> <stop-time>。如果两个时间值都设置为0,则表示会话不受时间限制。

t行可以在会话级别或媒体级别使用。如果同时在两个级别出现,则媒体级别的值将覆盖会话级别的值。

t=3629855536 3629859136
  1. r= 行指定会话的重复率。它定义了会话重复的时间和间隔。它的格式为:
r=<repeat interval> <active duration> <offsets...>
  • <repeat interval> 指定重复周期,单位为秒。
  • <active duration> 指定每个重复周期的活动持续时间,单位为秒。
  • <offsets...> 是一系列可选的偏移量,指定重复周期的开始时间相对于会话开始时间的偏移量,单位为秒。
r=604800 3600 0 90000

上面这个例子的含义是:

  • 会话每 604800 秒(一周)重复一次。
  • 每个重复周期的活动持续时间为 3600 秒(一小时)。
  • 第一个偏移量为 0,表示第一个重复周期从会话开始时间开始。
  • 第二个偏移量为 90000,表示第二个重复周期从会话开始时间后 90000 秒(一天)开始。

这个会话将每周重复一次,每次持续一小时。第一次重复从会话开始时间开始,第二次重复从会话开始时间后一天开始。

这个很少见,基本不用的。

  1. z= 行指定时区调整信息,可以同时跨多个时区。它的格式如下:
z=<adjustment time> <offset> <adjustment time> <offset> ....
  • <adjustment time> 是一个非负数,表示自1900年1月1日0时0分0秒以来的秒数,用于指定时区调整生效的时间。
  • <offset> 是一个时区偏移量,格式为 [+|-]hh:mm。
z=3629855536 +0700 3629859136 +0900
  • 从会话开始时间 3629855536 (2023年5月15日12:00:00 UTC) 到 3629859136 (2023年5月15日13:00:00 UTC),时区偏移量为 +0700,即UTC+7。
  • 从 3629859136 (2023年5月15日13:00:00 UTC) 开始,时区偏移量变为 +0900,即UTC+9。

这个也不常用,没啥好看的。

  1. k= 行用于传输加密密钥。已经被弃用,勿用
  2. a= 行则有很多很多属性了,这个在下面媒体级描述会介绍几个常见的。
  3. m= 行用于描述会话中的媒体流,定了媒体类型、传输协议、端口号等信息。下面就会详细介绍这个媒体级描述。

媒体描述

在一个 SDP 中一般会有多个媒体描述。每个媒体描述都是以 m= 开始,直到下一个 m= 结束,在两个m之间则是多个a属性。比如:

v=0 o=alice 2890844526 2890844526 IN IP4 host.example.com 
s=Video Conference
c=IN IP4 192.0.2.1 
t=0 0 
m=audio 49170 RTP/AVP 0 8 97 
a=rtpmap:0 PCMU/8000 
a=rtpmap:8 PCMA/8000 
a=rtpmap:97 iLBC/8000 
m=video 51372 RTP/AVP 31 32 
a=rtpmap:31 H261/90000 
a=rtpmap:32 MPV/90000

这里就有音频媒体描述和视频媒体描述。

下面具体介绍媒体描述的部分信息。

m= 行指定了媒体类型、传输协议、端口号等信息。它的结构如下:

m=<media> <port> <proto> <fmt>
  • <media> 指定媒体类型,如 audiovideoapplication 等。
  • <port> 指定媒体流使用的端口号或端口号范围。
  • <proto> 指定媒体流使用的传输协议,如 RTP/AVPUDP/TLS/RTP/SAVPF 等。
  • <fmt> 指定媒体流使用的编码格式,如 0 表示 PCMU、96 表示 H.264 等。
m=audio 49170 RTP/AVP 0 8 97

m=video 51372 RTP/AVP 31 32
  • m=audio 49170 RTP/AVP 0 8 97 描述了一个音频媒体流,使用端口 49170,传输协议为 RTP/AVP,编码格式为 PCMU、PCMA 和 iLBC。
  • m=video 51372 RTP/AVP 31 32 描述了一个视频媒体流,使用端口 51372,传输协议为 RTP/AVP,编码格式为 H.261 和 MPV。

注意,m行是 SDP 中必须要有的。

这里列出一个我电脑上的offer SDP部分媒体描述的信息,稍微有点长,大致看一看就行

m=audio 9 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:VxTY
a=ice-pwd:ApKdShlvinHdfDU9dGCnG9Jr
a=ice-options:trickle
a=fingerprint:sha-256 4F:3E:CD:A9:AF:08:08:3E:4E:45:7A:6D:5A:E0:11:AA:97:C2:63:41:6F:1C:BB:04:FD:26:56:B7:32:BB:00:F2
a=setup:actpass
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=sendrecv
a=msid:bd9c4660-aafd-40ad-96ae-3f235e8c038a fc57b116-b9bc-4447-8ba5-2fc46b2f04fc
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:63 red/48000/2
a=fmtp:63 111/111
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:13 CN/8000
a=rtpmap:110 telephone-event/48000
a=rtpmap:126 telephone-event/8000
a=ssrc:3837599071 cname:TBn9cdBnaJ9Ge5By
a=ssrc:3837599071 msid:bd9c4660-aafd-40ad-96ae-3f235e8c038a fc57b116-b9bc-4447-8ba5-2fc46b2f04fc
m=video 9 UDP/TLS/RTP/SAVPF 96 97 102 103 104 105 106 107 108 109 127 125 39 40 45 46 98 99 100 101 112 113 116 117 118
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:VxTY
a=ice-pwd:ApKdShlvinHdfDU9dGCnG9Jr
a=ice-options:trickle
a=fingerprint:sha-256 4F:3E:CD:A9:AF:08:08:3E:4E:45:7A:6D:5A:E0:11:AA:97:C2:63:41:6F:1C:BB:04:FD:26:56:B7:32:BB:00:F2
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=sendrecv
a=msid:bd9c4660-aafd-40ad-96ae-3f235e8c038a 7a2eb7b0-6af6-4a47-8d33-6eed848c6288
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

其中,重点需要看一下的就下面这几个:

  1. a=rtcp:9 IN IP4 0.0.0.0 表示 RTCP 使用端口 9,后面的几个参数同上
  2. a=sendrecv 表示既可以发送又可以接收。这里在直播时是不同的
  3. a=rtpmap:111 opus/48000/2 表示使用负载类型111的Opus编码,采样率为48000Hz,声道数为2(立体声)。一般可支持多个不同格式的编码,比如vp8vp9,它们的采样率也不一定相同 这个比较重要,它的格式如下:
a=rtpmap:<payload type> <encoding name>/<clock rate>[/<encoding parameters>]
  • <payload type> 是RTP负载类型编号,用于在RTP包头中标识载荷的编码格式。
  • <encoding name> 是编码格式的名称,如PCMU、VP8等。
  • <clock rate> 是编码时钟频率,单位是Hz,表示编码的采样率。
  • <encoding parameters> 是可选的编码参数,不同的编码格式可能有不同的参数。如音频是否是双声道,默认为单声道。

关于SDP的详细信息大致了解这么多就够了。再多也用不上,简单的业务简单处理。

小节

本小节详细介绍了有关SDP的各种信息。一个 SDP 只能有一个会话描述,可有多个媒体描述。媒体描述中包含了很多很多种信息。

重点需要关注的是网络地址信息、带宽信息、媒体信息中的编码格式、采样率。当然,也有涉及到安全部分,这里就不再介绍了,太多了。

下一小节来介绍下两个用户是如何建立连接的,冲冲冲

项目地址

前端:gitee.com/yoboom/webr…

后端:gitee.com/yoboom/webr…

项目功能如下:

image.png

感兴趣的可以直接去体验一下,欢迎star和提pr