type
status
date
slug
summary
tags
category
icon
password
前言:
本文是系列文章中的一篇,主要是记录在分析WebRTC建立连接过程里所应用的技术背景的理解,希望在对这个过程做解构之后,可以更进一步的理解WebRTC,从而有能力对其中的源码做出修剪,不止于WebRTC,在其他音视频领域都可以用到这其中的知识与技巧。
📝 WebRTC理解之SDP协议
SDP(Session Description Protocol)是一种通用的会话描述协议,主要用来描述多媒体会话,用途包括会话声明、会话邀请、会话初始化等。
WebRTC主要在连接建立阶段用到SDP,连接双方通过信令服务交换会话信息,包括音视频编解码器(codec)、主机候选地址、网络传输协议等。
下面先简单介绍下SDP的格式、常用属性,然后通过WebRTC连接建立过程生成的SDP实例进行进一步讲解。
|Field| Type | Opt/Mind| Description|
Session description
Time description
Media description, if present
协议格式说明
协议格式
<type>
:大小写敏感的一个字符,代表特定的属性,比如v
代表版本;
<value>
:结构化文本,格式与属性类型有关,UTF8编码;
=
两边不允许存在空格;
表示是可选的;
常见属性
以下面的SDP为例子:
协议版本号 v=
-- Protocol Version
格式如下,没有子版本号
会话发起者: o=
-- Origin
格式如下,其中,username、session-id、nettype、addrtype、unicast-address 一起,唯一标识一个会话。
各字段含义如下:
username
:发起者的用户名,不允许存在空格,如果应用不支持用户名,则为-。
sess-id
:会话id,由应用自行定义,规范的建议是NTP(Network Time Protocol)
时间戳。
sess-version
:会话版本,用途由应用自行定义,只要会话数据发生变化时(比如编码),sess-version
随着递增就行。同样的,规范的建议是NTP时间戳。
nettype
:网络类型,比如IN
表示Internet。
addrtype
:地址类型,比如IP4
、IV6
unicast-address
:域名,或者IP地址。会话名 s=
必选,有且仅有一个s=字段,且不能为空。如果实在没有有意义的会话名,可以赋一个空格,即
s=
。连接数据:c=
格式如下:
每个SDP至少需要包含一个会话级别的
c=
字段,或者在每个媒体描述后面各包含一个c=
字段。(媒体描述后的c=
会覆盖会话级别的c=
)- nettype:网络类型,比如IN,表示 Internet。
- addrtype:地址类型,比如IP4、IP6。
- connection-address:如果是广播,则为广播地址组;如果是单播,则为单播地址;
举例01:
举例02:
媒体描述:m=
SDP可能同时包含多个媒体描述。格式如下:
其中:
media
:媒体类型。包括 video
、audio
、text
、application
、message
等。
port
:传输媒体流的端口,具体含义取决于使用的网络类型(在c=
中声明)和使用的协议(proto
,在m=
中声明)。
proto
:传输协议,具体含义取决于c=
中定义的地址类型,比如c=
是IP4
,那么这里的传输协议运行在IP4之上。比如:
UDP
:传输层协议是UDP。
RTP/AVP
:针对视频、音频的RTP协议,跑在UDP之上。
RTP/SAVP
:针对视频、音频的SRTP协议,跑在UDP之上。fmt
:媒体格式的描述,可能有多个。根据 proto 的不同,fmt 的含义也不同。比如 proto
为 RTP/SAVP
时,fmt 表示 RTP payload 的类型。如果有多个,表示在这次会话中,多种payload类型可能会用到,且第一个为默认的payload类型。
举例,下面表示媒体类型是视频,采用SRTP传输流媒体数据,且RTP包的类型可能是122、102...119
,默认是122。对于
RTP/SAVP
,需要注意的是,payload type 又分两种类型:静态类型:参考 RTP/AVP audio and video payload types。
动态类型:在a=fmtp:里进行定义。(a=为附加属性,见后面小节)
举例,下面的SDP中:
对于audio,111 是动态类型,表示
opus/48000/2
。
对于video,122 是动态类型,表示H264/90000
。附加属性:a=
作用:用于扩展SDP。
有两种作用范围:会话级别(
session-level
)、媒体级别(media-level
)。媒体级别:媒体描述(
m=
)后面可以跟任意数量的 a=
字段,对媒体描述进行扩展。
会话级别:在第一个媒体字段(media field
)前,添加的a=
字段是会话级别的。
有如下两种格式:格式1举例:
格式2举例:
时间:t=
作用:声明会话的开始、结束时间。
格式如下:
如果
<stop-time>
是0,表示会话没有结束的边界,但是需要在<start-time>
之后会话才是活跃(active)的。如果<start-time>
是0,表示会话是永久的。举例:
WebRTC实例
下面例子来自腾讯云WebRTC服务的远端offer。
后记
SDP协议格式本身很简单,难点一般在于应用层在不同场景下扩展出来的属性,以及不同扩展属性对应的含义。比如上面举的例子,扩展属性、属性值的说明分散在数十个RFC里。
- m line 里会指明传输协议,例如 UDP/TLS/RTP/SAVPF,最后的 SAVPF 还有其他几种值:AVP, SAVP, AVPF, SAVPF AVP 意为 AV profile
- S 意为 secure
- F 意为 feedback
- rtpmap 是描述 codec 的,但有特殊的 rtx codec,其实不是 codec,例如 rtx;
- fmtp 补充描述 codec 的参数,format parameters
- max-fr: maximum framerate
- profile-level-id: H.264 的 profile level id
- rtx 描述重传策略,由 rtpmap 指明,它的参数由 fmtp 描述
- apt: associated payload type,指明所描述的 stream;
- rtx-time: rtp 包在缓冲区保留时间;
- rtcp-fb: RTCP 反馈机制
- offer 里面列出一些反馈机制,answer 里应移除不理解、不支持的机制,但不能修改;
- ack rpsi/app
- nack pli/sli/rpsi/app
- rpsi: reference picture selection indication
- app: app 层反馈机制
- pli: picture loss indication,表明收流端丢失了一幅图像的一些数据,发送端可能会发送一个 I 帧(类似于 FIR),但要考虑拥塞控制
- sli: slice loss indication
- ccm fir: codec control message, full intra refresh
- fec 类似于 rtx,也由 rtpmap 指明,它的参数由 fmtp 指明;
附件 常见负载类型
Schulzrinne & Casner Standards Track [Page 33]
RFC 3551 RTP A/V Profile July 2003