音视频学习(五十七):RTSP信令交互流程
什么是 RTSP 信令?
RTSP (Real Time Streaming Protocol) 是一种应用层协议,用于控制实时流媒体服务器。它本身不传输数据,而是像一个“远程遥控器”,负责管理和控制媒体流的传输。RTSP 信令就指服务器与客户端之间,用于建立、控制和终止流媒体会话的命令和响应。
RTSP 的核心信令包括:
- DESCRIBE:客户端请求服务器,获取媒体流的详细信息。
- SETUP:客户端通知服务器,准备好接收数据,并协商传输参数。
- PLAY:客户端请求服务器开始发送数据流。
- PAUSE:客户端请求服务器暂停数据流。
- TEARDOWN:客户端请求服务器终止会话,释放资源。
- OPTIONS:客户端查询服务器支持哪些命令。
SDP描述
在 RTSP 信令中,SDP (Session Description Protocol) 扮演着至关重要的角色。它不是一个传输协议,而是一个纯文本格式的协议,用于描述多媒体会话的参数。你可以把它看作是媒体流的“蓝图”或“说明书”。
会话级描述 (Session-level)
这部分描述了整个会话的全局信息,对会话中的所有媒体流都有效。
行 | 示例 | 作用 |
---|---|---|
v= | v=0 | 版本号。SDP 的版本号,目前通常为 0。 |
o= | o=- 1587397985834861 1 IN IP4 192.168.1.100 | 会话发起者和会话 ID。 - 通常表示用户名未知,后面的两个数字是会话 ID 和版本号,用于唯一标识会话。IN IP4 表示网络类型为 IPv4。 |
s= | s=RTSPServer | 会话名称。一个描述性的会话名称。 |
c= | c=IN IP4 0.0.0.0 | 连接信息。描述了媒体流的发送地址。在 RTSP 中,0.0.0.0 通常表示数据流将从源头(服务器)发送。 |
t= | t=0 0 | 时间信息。描述了会话的开始和结束时间戳。0 0 表示会话没有明确的开始和结束时间,通常用于直播流。 |
a= | a=tool:LIVE555 Streaming Media | 会话属性。这是一个通用的属性行,可以包含多种会话级别的信息,如使用的工具、会话类型等。 |
媒体级描述 (Media-level)
这部分描述了会话中包含的每一个媒体流的具体信息,通常以 m=
行开头,并由其后面的 a=
行进行详细说明。一个 SDP 文件可以包含多个媒体级描述,例如一个视频流和一个音频流。
行 | 示例 | 作用 |
---|---|---|
m= | m=video 0 RTP/AVP 96 | 媒体流类型。这是媒体级描述的起点。video 是媒体类型;0 表示端口号将由传输协议(如 SETUP 信令)指定;RTP/AVP 是传输协议;96 是一个动态负载类型(Payload Type)。 |
a= | a=rtpmap:96 H264/90000 | 负载类型映射。将前面 m= 行定义的动态负载类型 96 映射到具体的编码格式 H264 ,并指定其时钟频率为 90000 Hz (RTP 标准)。这是非常关键的一行,告诉接收端如何解析 RTP 包中的数据。 |
a= | a=fmtp:96 packetization-mode=1;... | 格式化参数。提供了编码格式的详细参数。对于 H.264,这行会包含 profile 、level 等信息,最重要的是 sprop-parameter-sets ,它包含了 SPS (Sequence Parameter Set) 和 PPS (Picture Parameter Set)。这些参数是 Base64 编码的,是解码器成功初始化和解析视频流所必需的。 |
a= | a=control:track1 | 控制 URI。这是 RTSP 特有的,用于指定该媒体流的控制 URI。在后续的 SETUP 、PLAY 等信令中,客户端会使用这个 URI 来操作特定的媒体流。 |
a= | a=framerate:25.0 | 帧率信息。指定该视频流的帧率。 |
SDP信息交互流程
SDP 信息的传递通常发生在 DESCRIBE 命令的响应中。下面我们详细拆解一个典型的 RTSP 媒体会话建立过程,看看 SDP 是如何被使用的。
1. OPTIONS(可选)
在建立会话之前,客户端可能会发送一个 OPTIONS
请求来探测服务器的能力。
-
客户端发送:
OPTIONS rtsp://example.com/stream RTSP/1.0 CSeq: 1
-
服务器响应
RTSP/1.0 200 OK CSeq: 1 Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE
服务器告诉客户端,它支持
DESCRIBE
、SETUP
等命令,为后续的会话做准备。
2. DESCRIBE:获取媒体“蓝图” (SDP)
这是 SDP 信息交互的核心步骤。客户端发送 DESCRIBE
请求,服务器将包含 SDP 的响应返回。
-
客户端发送:
DESCRIBE rtsp://example.com/stream RTSP/1.0 CSeq: 2 Accept: application/sdp
客户端告诉服务器,它接受以
application/sdp
格式返回的会话描述。 -
服务器响应
RTSP/1.0 200 OK CSeq: 2 Content-Base: rtsp://example.com/stream/ Content-Type: application/sdp Content-Length: 454v=0 o=- 1587397985834861 1 IN IP4 192.168.1.100 s=RTSPServer c=IN IP4 0.0.0.0 t=0 0 a=tool:LIVE555 Streaming Media a=type:broadcast a=control:*m=video 0 RTP/AVP 96 a=rtpmap:96 H264/90000 a=fmtp:96 packetization-mode=1;profile-level-id=42c016;sprop-parameter-sets=Z0LAHuiwCgk=,aM48gA== a=framerate:25.0 a=control:track1m=audio 0 RTP/AVP 97 a=rtpmap:97 MPEG4-GENERIC/44100 a=fmtp:97 streamtype=5;profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1200 a=control:track2
响应分析:
Content-Type: application/sdp
:明确说明响应体是 SDP 格式。- 会话级描述:
v=
,o=
,s=
等行描述了整个流媒体会话。c=IN IP4 0.0.0.0
表示数据流将从源地址(服务器)发送。 - 媒体级描述:
m=video 0 RTP/AVP 96
:描述了一个视频流。0
表示端口号将由SETUP
命令指定,RTP/AVP
是传输协议,96
是一个动态的负载类型(Payload Type)。a=rtpmap:96 H264/90000
:将负载类型96
映射到H264
编码格式,时钟频率为90000 Hz
(RTP 标准)。a=fmtp:96 ...
:提供 H.264 编码的详细参数。sprop-parameter-sets
是一个关键部分,它包含了 Base64 编码的 SPS (Sequence Parameter Set) 和 PPS (Picture Parameter Set)。客户端需要这些参数来初始化解码器。a=control:track1
:这是一个关键的控制 URI,后续的SETUP
和PLAY
命令将针对这个 URI 进行操作。
3. SETUP:建立传输通道
客户端根据 DESCRIBE
响应中的 SDP 信息,为每个媒体流(视频和音频)发送独立的 SETUP
请求。
-
客户端发送(视频):
SETUP rtsp://example.com/stream/track1 RTSP/1.0 CSeq: 3 Transport: RTP/AVP/UDP;unicast;client_port=5000-5001
Transport
头:客户端告知服务器,它希望使用 RTP over UDP 进行单播传输,并指定了用于接收数据的本地端口范围5000-5001
(RTP 端口和 RTCP 端口)。 -
服务器响应(视频):
RTSP/1.0 200 OK CSeq: 3 Transport: RTP/AVP/UDP;unicast;client_port=5000-5001;server_port=5002-5003;ssrc=12345678 Session: 1A2B3C4D
-
服务器响应
server_port
,告知客户端它将使用5002-5003
端口发送数据。 -
Session
头:服务器返回一个唯一的会话 ID,客户端需要在后续的PLAY
和TEARDOWN
请求中带上这个 ID。
-
4. PLAY:开始传输数据
在 SETUP
成功后,客户端发送 PLAY
请求,告诉服务器可以开始发送数据了。
-
客户端发送:
PLAY rtsp://example.com/stream/ RTSP/1.0 CSeq: 4 Session: 1A2B3C4D
-
服务器响应:
RTSP/1.0 200 OK CSeq: 4 Session: 1A2B3C4D RTP-Info: url=rtsp://example.com/stream/track1;seq=123;rtptime=12345
服务器开始向客户端发送 RTP 数据流。
5. TEARDOWN:结束会话
当播放结束时,客户端发送 TEARDOWN
请求以终止整个会话。
-
客户端发送:
TEARDOWN rtsp://example.com/stream/ RTSP/1.0 CSeq: 5 Session: 1A2B3C4D
-
服务器响应:
RTSP/1.0 200 OK CSeq: 5
服务器释放相关资源,会话结束。
H.264/H.265 NALU 类型
H.264 NALU 类型总结
H.264 的 NALU 头部是 1 个字节,其结构如下:
F (1 bit) | NRI (2 bits) | Type (5 bits) |
---|
- F(禁止位): 通常为
0
。 - NRI(重要性指示): 指示该 NALU 的重要性,用于丢包时的决策。
- Type(类型): 决定了 NALU 的具体类型。
常见的 H.264 NALU 类型有:
Type 值 | NALU 类型名称 | 作用 |
---|---|---|
1-23 | 单 NALU 单元 | 包含一帧图像的一部分或全部数据。1 代表非 IDR 图像的分片,5 代表 IDR 图像的分片。 |
7 | SPS (Sequence Parameter Set) | 序列参数集。包含解码器所需的全局信息,如分辨率、帧率、码流的重要级别等。 |
8 | PPS (Picture Parameter Set) | 图像参数集。包含单个或多个图像共享的参数,如熵编码方式、量化参数等。 |
9 | AUD (Access Unit Delimiter) | 访问单元分隔符。用于分隔不同的帧,标记一帧的开始。 |
10, 11 | SEI (Supplemental Enhancement Information) | 补充增强信息。包含时序、版权等辅助信息。 |
24 | STAP-A | 单一时间聚合包。用于将多个小的 NALU(如 SPS、PPS、AUD)封装在一个 RTP 包中发送。 |
28 | FU-A (Fragmentation Unit A) | 分片单元 A。用于将一个大的 NALU(通常是 I 帧)分成多个小块,以便在 RTP 包中传输。 |
H.265 (HEVC) NALU 类型总结
H.265 的 NALU 头部是 2 个字节,其结构如下:
F (1 bit) | Type (6 bits) | LayerId (6 bits) | TID (3 bits) |
---|
- F(禁止位): 通常为
0
。 - Type(类型): 决定了 NALU 的具体类型。
- LayerId(层 ID): 用于分层编码。
- TID (TemporalId): 用于时域可分级编码。
常见的 H.265 NALU 类型有:
Type 值 | NALU 类型名称 | 作用 |
---|---|---|
0-31 | 视频编码层 (VCL) NALU | 包含实际的视频数据。19 通常代表 IDR 图像的分片,1 代表普通的分片。 |
32 | VPS (Video Parameter Set) | 视频参数集。H.265 新增,位于 SPS 之上,用于描述多个序列的共享参数,例如分层结构信息。 |
33 | SPS (Sequence Parameter Set) | 序列参数集。与 H.264 类似,但包含更多参数,用于解码。 |
34 | PPS (Picture Parameter Set) | 图像参数集。与 H.264 类似,包含帧级的参数。 |
35 | AUD (Access Unit Delimiter) | 访问单元分隔符。用于标记一帧的开始。 |
39 | SEI (Supplemental Enhancement Information) | 补充增强信息。与 H.264 类似。 |
48 | 聚合包 | 用于将多个小 NALU 聚合在一个 RTP 包中。 |
49 | FU-A (Fragmentation Unit A) | 分片单元 A。用于将一个大的 NALU 分片传输。 |
总结
RTSP 信令是一个严谨的、分步骤的控制流程。SDP 在这个流程中扮演了“粘合剂”和“协议协商者”的角色,它通过 DESCRIBE
响应,将复杂而关键的媒体参数(如编码格式、SPS/PPS、时钟频率等)一次性传递给客户端。这使得客户端能够:
- 了解服务器提供了哪些媒体流(视频、音频)。
- 知道如何配置自己的解码器(通过 SPS/PPS 等参数)。
- 通过 SDP 中提供的
control
URI,与服务器进行后续的SETUP
和PLAY
等操作。