一、RTSP 方法总览
RTSP 是一种基于文本的控制协议,所有交互由请求(Request)和响应(Response)构成。方法定义在 RFC 2326 中,核心方法如下:
| 方法 | 方向 | 说明 |
|---|---|---|
| OPTIONS | C→S | 查询服务器支持的方法列表,也可用于保活 |
| DESCRIBE | C→S | 请求媒体流的 SDP 描述信息(编码类型、帧率等) |
| SETUP | C→S | 配置传输方式(TCP/UDP),建立会话 |
| PLAY | C→S | 启动或恢复媒体传输 |
| PAUSE | C→S | 暂停媒体传输,可用 PLAY 恢复 |
| TEARDOWN | C→S | 终止会话,停止数据传输 |
| GET_PARAMETER | C→S | 获取会话参数,也常用于保活 |
| SET_PARAMETER | C→S | 设置会话参数,推荐的保活方法 |
此外推流场景使用ANNOUNCE(C→S)和RECORD(C→S)替代 DESCRIBE 和 PLAY。
二、拉流信令流程(客户端拉流)
2.1 完整信令时序
客户端 服务器 │ │ │──── OPTIONS rtsp://... RTSP/1.0 ────────►│ ① 查询方法 │◄─── 200 OK (Public: ...) ───────────────│ │ │ │──── DESCRIBE rtsp://... RTSP/1.0 ───────►│ ② 请求SDP │ Accept: application/sdp │ │◄─── 200 OK (SDP正文) ───────────────────│ │ │ │──── SETUP rtsp://.../track1 RTSP/1.0 ───►│ ③ 建立传输通道 │ Transport: RTP/AVP/TCP;unicast; │ │ interleaved=0-1 │ │◄─── 200 OK (Session: 12345678) ─────────│ │ │ │──── PLAY rtsp://... RTSP/1.0 ───────────►│ ④ 开始播放 │ Session: 12345678 │ │◄─── 200 OK ─────────────────────────────│ │ │ │◄═══════ RTP 数据流 ════════════════════│ ⑤ 媒体传输 │ │ │──── TEARDOWN rtsp://... RTSP/1.0 ───────►│ ⑥ 结束会话
2.2 OPTIONS 示例
客户端询问服务器支持哪些方法:
C→S: OPTIONS rtsp://192.168.1.100:554/live RTSP/1.0 CSeq: 1 User-Agent: MyClient/1.0
S→C: RTSP/1.0 200 OK CSeq: 1 Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, GET_PARAMETER, SET_PARAMETER
Public头列出了服务器支持的所有方法。这一步可选,但推荐执行,用于确认服务器能力。
2.3 DESCRIBE 示例
请求媒体描述,服务器返回 SDP:
C→S: DESCRIBE rtsp://192.168.1.100:554/live RTSP/1.0 CSeq: 2 Accept: application/sdp
S→C: RTSP/1.0 200 OK CSeq: 2 Content-Type: application/sdp Content-Base: rtsp://192.168.1.100:554/live/ Content-Length: 376 v=0 o=- 123456 123456 IN IP4 192.168.1.100 s=Live Stream t=0 0 a=control:* m=video 0 RTP/AVP 96 a=rtpmap:96 H264/90000 a=fmtp:96 packetization-mode=1;profile-level-id=42C01E;sprop-parameter-sets=Z0LAHtoCgPaEAAAAwAQAAAMDGxQ=,aM4yyA== a=control:streamid=0 m=audio 0 RTP/AVP 97 a=rtpmap:97 MPEG4-GENERIC/48000/2 a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1190 a=control:streamid=1
关键头字段:
Content-Type: application/sdp:响应体是 SDPContent-Base:SDP 中相对 control URL 的基础路径a=control:streamid=0:视频流的控制标识,后续 SETUP 使用
2.4 SETUP 示例
为每一路媒体流分别发送 SETUP。TCP 交织模式(推荐):
C→S: SETUP rtsp://192.168.1.100:554/live/streamid=0 RTSP/1.0 CSeq: 3 Transport: RTP/AVP/TCP;unicast;interleaved=0-1
UDP 模式:
C→S: SETUP rtsp://192.168.1.100:554/live/streamid=0 RTSP/1.0 CSeq: 3 Transport: RTP/AVP;unicast;client_port=49170-49171
服务器响应:
S→C: RTSP/1.0 200 OK CSeq: 3 Transport: RTP/AVP/TCP;unicast;interleaved=0-1 Session: 12345678
关键点:
interleaved=0-1:RTP 走通道 0,RTCP 走通道 1,复用 RTSP 的 TCP 连接client_port=49170-49171:客户端指定接收端口(UDP 模式)Session: 12345678:后续所有请求必须携带此标识
音频流也需要单独 SETUP,指定streamid=1,使用interleaved=2-3。
2.5 PLAY 示例
C→S: PLAY rtsp://192.168.1.100:554/live RTSP/1.0 CSeq: 4 Session: 12345678 Range: npt=0-
Range: npt=0-表示从头播放到尾。直播场景可省略 Range。
服务器响应后,开始通过 RTP 发送媒体数据。
2.6 PAUSE 与恢复
C→S: PAUSE rtsp://192.168.1.100:554/live RTSP/1.0 CSeq: 5 Session: 12345678
恢复时重新发送 PLAY(可不带 Range,从暂停点继续)。
2.7 TEARDOWN 示例
C→S: TEARDOWN rtsp://192.168.1.100:554/live RTSP/1.0 CSeq: 6 Session: 12345678
S→C: RTSP/1.0 200 OK CSeq: 6 Session: 12345678
会话终止,服务器释放所有资源。
三、推流信令流程
推流用ANNOUNCE和RECORD替代拉流的 DESCRIBE 和 PLAY:
3.1 ANNOUNCE 示例
客户端主动告知服务器要推什么流,SDP 由客户端生成:
C→S: ANNOUNCE rtsp://server.example.com/live/test RTSP/1.0 CSeq: 1 Content-Type: application/sdp Content-Length: 320 v=0 o=- 0 0 IN IP4 192.168.1.50 s=Live Push t=0 0 a=control:* m=video 0 RTP/AVP 96 a=rtpmap:96 H264/90000 a=fmtp:96 packetization-mode=1;profile-level-id=42C01E;sprop-parameter-sets=Z0LAHtoCgPaEAAAAwAQAAAMDGxQ=,aM4yyA== a=control:streamid=0
S→C: RTSP/1.0 200 OK CSeq: 1
3.2 SETUP 与 RECORD
SETUP 与拉流相同(TCP 交织模式):
C→S: SETUP rtsp://server.example.com/live/test/streamid=0 RTSP/1.0 CSeq: 2 Transport: RTP/AVP/TCP;unicast;interleaved=0-1
S→C: RTSP/1.0 200 OK CSeq: 2 Session: 87654321 Transport: RTP/AVP/TCP;unicast;interleaved=0-1
RECORD 启动推流:
C→S: RECORD rtsp://server.example.com/live/test RTSP/1.0 CSeq: 3 Session: 87654321
S→C: RTSP/1.0 200 OK CSeq: 3 Session: 87654321
之后客户端开始通过 RTP 发送媒体数据。推流与拉流的核心区别:DESCRIBE(服务器→客户端)变为 ANNOUNCE(客户端→服务器),PLAY 变为 RECORD。
四、SDP 参数逐项详解
SDP 由会话级描述和媒体级描述组成,格式为<type>=<value>。
4.1 会话级字段
| 字段 | 示例值 | 含义 |
|---|---|---|
v= | 0 | SDP 版本,固定为 0 |
o= | - 123456 123456 IN IP4 192.168.1.100 | 会话发起者:用户名-,会话 ID123456,版本123456,网络类型IN,地址类型IP4,地址 |
s= | Live Stream | 会话名称 |
t= | 0 0 | 起始时间 0,结束时间 0(无限制) |
c= | IN IP4 0.0.0.0 | 连接地址(可选,媒体级可覆盖) |
a=control: | * | 聚合控制 URL,*表示使用 Content-Base |
4.2 视频媒体行m=video 0 RTP/AVP 96
格式:m=<media> <port> <proto> <fmt>
| 参数 | 值 | 含义 |
|---|---|---|
<media> | video | 媒体类型 |
<port> | 0 | 端口占位符,实际端口由 SETUP 协商 |
<proto> | RTP/AVP | RTP over UDP;RTP/AVP/TCP表示 TCP |
<fmt> | 96 | 动态载荷类型(96-127) |
4.3 视频编码行a=rtpmap:96 H264/90000
格式:a=rtpmap:<pt> <encoding>/<clock rate>
| 参数 | 值 | 含义 |
|---|---|---|
<pt> | 96 | 载荷类型,与 m= 行对应 |
<encoding> | H264 | RFC 6184 规定的编码名 |
<clock rate> | 90000 | H.264 的 RTP 时钟固定为 90 kHz |
4.4 H.264 的a=fmtp行
a=fmtp:96 packetization-mode=1;profile-level-id=42C01E;sprop-parameter-sets=Z0LAHtoCgPaEAAAAwAQAAAMDGxQ=,aM4yyA==
packetization-mode:
| 值 | 含义 |
|---|---|
0 | 单 NAL 模式,大帧会被拒绝 |
1 | 非交错分片模式(FU-A),主流选择 |
2 | 交错模式,极少使用 |
profile-level-id是 3 字节十六进制:
| 字节 | 示例42C01E | 含义 |
|---|---|---|
| 第 1 字节 | 42= 66 | Baseline Profile |
| 第 2 字节 | C0= 11000000 | Constrained Baseline(约束标志) |
| 第 3 字节 | 1E= 30 | Level 3.0 |
常用 Level:1E(3.0)、1F(3.1)、28(4.0)、29(4.1)、2A(4.2)。
sprop-parameter-sets是逗号分隔的 Base64 编码 NAL:
Z0LAHtoCgPaEAAAAwAQAAAMDGxQ=解码后首字节0x67,是SPS(NAL type 7)aM4yyA==解码后首字节0x68,是PPS(NAL type 8)
为什么必须带外传输 SPS/PPS?解码器在解码任何帧之前需要 SPS/PPS 初始化。带外传输可以避免等待首个 I 帧,降低首帧延迟。
4.5 音频媒体行m=audio 0 RTP/AVP 97
结构与视频相同,载荷类型97与视频的96区分。
4.6 音频编码行a=rtpmap:97 MPEG4-GENERIC/48000/2
| 参数 | 值 | 含义 |
|---|---|---|
<encoding> | MPEG4-GENERIC | AAC 在 RTP 中的标准名(非AAC) |
<clock rate> | 48000 | 采样率 48 kHz |
| 第 4 参数 | 2 | 声道数:2 立体声 |
4.7 AAC 的a=fmtp行
a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1190
| 参数 | 值 | 含义 |
|---|---|---|
profile-level-id | 1 | MPEG-4 Audio Profile Level 1 |
mode | AAC-hbr | AAC 高比特率模式 |
sizelength | 13 | AU-size 字段 13 比特 |
indexlength | 3 | AU-Index 字段 3 比特 |
indexdeltalength | 3 | AU-Index-delta 字段 3 比特 |
config | 1190 | AudioSpecificConfig 十六进制 |
config=1190解码:
0x1190 = 0001 0001 1001 0000
| 字段 | 比特 | 值 | 含义 |
|---|---|---|---|
| audioObjectType | 5 | 00010=2 | AAC-LC |
| samplingFrequencyIndex | 4 | 0011=3 | 48000 Hz |
| channelConfiguration | 4 | 0010=2 | 立体声 |
| GASpecificConfig | 3 | 000 | 帧长 1024 |
没有config参数,AAC 解码器完全无法初始化。这是音频无声的最常见原因。
4.8a=control属性
a=control:streamid=0
用于指定媒体流的控制 URL。会话级a=control:*表示聚合控制,媒体级指定单个轨道的控制标识。后续 SETUP 请求的 URL 就是Content-Base + 媒体级 control 值。
五、Transport 头参数详解
SETUP 请求的Transport头决定传输方式。
5.1 TCP 交织模式
Transport: RTP/AVP/TCP;unicast;interleaved=0-1
| 参数 | 值 | 含义 |
|---|---|---|
| 协议 | RTP/AVP/TCP | RTP over TCP |
| 传输类型 | unicast | 单播 |
interleaved | 0-1 | RTP 通道 0,RTCP 通道 1 |
RTP 包直接嵌入 RTSP 的 TCP 流中,用$字符 + 通道号标识。
5.2 UDP 模式
Transport: RTP/AVP;unicast;client_port=49170-49171
| 参数 | 含义 |
|---|---|
client_port=49170-49171 | 客户端接收端口:RTP 49170,RTCP 49171 |
server_port=6256-6257(响应中) | 服务器发送端口 |
UDP 延迟更低,但容易丢包;TCP 更可靠,但有队头阻塞。
六、完整 SDP 示例与参数速查
H.264 + AAC 完整 SDP:
v=0 o=- 123456 123456 IN IP4 192.168.1.100 s=Live Stream t=0 0 a=control:* m=video 0 RTP/AVP 96 a=rtpmap:96 H264/90000 a=fmtp:96 packetization-mode=1;profile-level-id=42C01E;sprop-parameter-sets=Z0LAHtoCgPaEAAAAwAQAAAMDGxQ=,aM4yyA== a=control:streamid=0 m=audio 0 RTP/AVP 97 a=rtpmap:97 MPEG4-GENERIC/48000/2 a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1190 a=control:streamid=1
参数速查表:
| SDP 字段 | 视频(H.264) | 音频(AAC) |
|---|---|---|
| 载荷类型 | 96 | 97 |
| 编码名 | H264 | MPEG4-GENERIC |
| 时钟频率 | 90000 | 48000 |
| 关键 fmtp 参数 | packetization-mode,profile-level-id,sprop-parameter-sets | config,mode,sizelength |
| 控制标识 | a=control:streamid=0 | a=control:streamid=1 |
七、小结
RTSP 的核心是信令与数据分离:RTSP 负责控制(OPTIONS/DESCRIBE/SETUP/PLAY/TEARDOWN),RTP 负责传输媒体数据。
拉流流程:
OPTIONS → DESCRIBE → SETUP → PLAY → TEARDOWN推流流程:
OPTIONS → ANNOUNCE → SETUP → RECORD → TEARDOWNSDP 核心:
m=行定义媒体,a=rtpmap绑定编码,a=fmtp携带 H.264 的 SPS/PPS 和 AAC 的config
理解这些信令细节,是排查 RTSP 兼容性问题的基础——从“花屏”到“无声”,从“连接超时”到“会话断开”,根源往往就在这些参数之中。