上一篇介绍了 媒体协商,知道了它的作用就是用来传递双方的媒体信息。但是,具体有哪些媒体信息并没有说明。那么这节就来详细介绍下 媒体协商 过程中传递的媒体信息,也就是 SDP,到底有哪些内容。
这节内容纯纯硬货,没有任何感情和技巧。但只需要稍微了解一下就行,记是记不住的,只能划划水了。
SDP 由会话描述和媒体描述两个部分组成。一个 SDP 只有一个会话描述,但可以有多个媒体描述。
会话描述
一个SDP仅有一个会话描述,通常有以下15种类型的行。
v=
行定义了 SDP 的版本
v=0
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>
为IP4
或IP6
,是IP的类型。<unicast-address>
则是ip
地址。
一个o=
的例子如下
o=- 5320411424692107684 2 IN IP4 127.0.0.1
s=
行定义了会话的文本名称,每个会话都必须有一个名称,且只能有一个。如果实在没有,则会用-
来代替,比如:
s=-
i=
行则定义了会话的信息,是一个文本描述。每个会话描述、每个媒体描述都至多只有一个。
i= SDP Offer
u=
行定义了一个URI,提供有关会话描述的额外信息或元数据。但在实际的 WebRTC 应用中,通常不需要使用这个字段,因为 SDP 本身已经包含了建立 WebRTC 连接所需的所有必要信息。大多数浏览器实现在生成 SDP 时也不会包含u
字段。
u=http://example.com/meetings/videoconference1234.xml
e=
行提供一个联系人的电子邮件地址,以便在需要时与会话相关人员取得联系。这个字段是可选的。
e=cxyi7@example.com
p=
行用于指定与会话相关的电话号码,以便在需要时与会话相关人员取得联系。这个字段是可选的。
p=1008611
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
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。
这个带宽信息还是挺重要的,假如你的带宽有限,那么则需要重点关注这部分。
t=
行用于指定会话的活动时间范围。格式为t=<start-time> <stop-time>
。如果两个时间值都设置为0,则表示会话不受时间限制。
t
行可以在会话级别或媒体级别使用。如果同时在两个级别出现,则媒体级别的值将覆盖会话级别的值。
t=3629855536 3629859136
r=
行指定会话的重复率。它定义了会话重复的时间和间隔。它的格式为:
r=<repeat interval> <active duration> <offsets...>
<repeat interval>
指定重复周期,单位为秒。<active duration>
指定每个重复周期的活动持续时间,单位为秒。<offsets...>
是一系列可选的偏移量,指定重复周期的开始时间相对于会话开始时间的偏移量,单位为秒。
r=604800 3600 0 90000
上面这个例子的含义是:
- 会话每 604800 秒(一周)重复一次。
- 每个重复周期的活动持续时间为 3600 秒(一小时)。
- 第一个偏移量为 0,表示第一个重复周期从会话开始时间开始。
- 第二个偏移量为 90000,表示第二个重复周期从会话开始时间后 90000 秒(一天)开始。
这个会话将每周重复一次,每次持续一小时。第一次重复从会话开始时间开始,第二次重复从会话开始时间后一天开始。
这个很少见,基本不用的。
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。
这个也不常用,没啥好看的。
k=
行用于传输加密密钥。已经被弃用,勿用。a=
行则有很多很多属性了,这个在下面媒体级描述会介绍几个常见的。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>
指定媒体类型,如audio
、video
、application
等。<port>
指定媒体流使用的端口号或端口号范围。<proto>
指定媒体流使用的传输协议,如RTP/AVP
、UDP/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
其中,重点需要看一下的就下面这几个:
a=rtcp:9 IN IP4 0.0.0.0
表示 RTCP 使用端口 9,后面的几个参数同上a=sendrecv
表示既可以发送又可以接收。这里在直播时是不同的a=rtpmap:111 opus/48000/2
表示使用负载类型111的Opus编码,采样率为48000Hz,声道数为2(立体声)。一般可支持多个不同格式的编码,比如vp8
,vp9
,它们的采样率也不一定相同 这个比较重要,它的格式如下:
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
只能有一个会话描述,可有多个媒体描述。媒体描述中包含了很多很多种信息。
重点需要关注的是网络地址信息、带宽信息、媒体信息中的编码格式、采样率。当然,也有涉及到安全部分,这里就不再介绍了,太多了。
下一小节来介绍下两个用户是如何建立连接的,冲冲冲
项目地址
项目功能如下:
感兴趣的可以直接去体验一下,欢迎star和提pr