RTSP 协议基础:从一次推流事故说起

我记得刚入行那会儿,接手过一个视频监控项目。摄像头画面总是卡顿,偶尔还断流。我查了三天,最后发现是 RTSP 的 OPTIONS 请求没处理好。嗯,从那以后我就明白——搞推流优化,RTSP 协议基础必须打牢。

今天咱们就聊聊 RTSP 协议。说白了,它就是流媒体世界的遥控器。你按播放,它帮你找资源;你按暂停,它让服务器停发数据。但真正干活的是 RTP 和 RTCP,这个关系得先理清楚。

RTSP 是什么?

RTSP(Real Time Streaming Protocol)是一个应用层协议,由 RFC 2326 定义。它负责控制流媒体的播放、暂停、快进、后退等操作。注意,它不负责传输媒体数据本身。

核心要点:RTSP 是控制协议,不是传输协议。它像是一个指挥官,告诉服务器什么时候发数据、发什么数据,但数据本身由 RTP 来搬运。

我在项目中遇到过不少新手,以为 RTSP 能直接传视频流。其实不是。RTSP 只负责建立和控制会话,真正的音视频数据走的是 RTP 通道。

RTSP 与 RTP/RTCP 的关系

这三者的关系,我用一个比喻来解释:

  • RTSP:像餐厅里的服务员,负责点菜、催菜、结账。
  • RTP:像传菜员,负责把菜(音视频数据)从厨房端到餐桌。
  • RTCP:像品控员,负责反馈菜好不好吃、有没有洒出来。

你想想看,没有 RTSP,你没法告诉服务器要播放哪路流;没有 RTP,数据传不过去;没有 RTCP,你根本不知道网络质量怎么样。

协议 端口 作用 传输方式
RTSP 554(默认) 会话控制(播放、暂停、停止) TCP(通常)
RTP 动态分配(偶数为 RTP) 传输音视频数据 UDP(通常)
RTCP 动态分配(奇数为 RTCP) 质量反馈、同步 UDP(通常)

个人习惯:我一般把 RTSP 端口固定为 554,RTP/RTCP 端口通过协商动态分配。这样既安全又灵活。

RTSP 消息格式与交互流程

RTSP 的消息格式和 HTTP 很像,但它是面向实时流的。消息分为请求和响应两类。

请求消息格式

方法 URI RTSP版本
首部字段名: 字段值
(空行)
消息体(可选)

举个例子:

PLAY rtsp://example.com/video.mp4 RTSP/1.0
CSeq: 4
Session: 12345678
Range: npt=10-15

响应消息格式

RTSP版本 状态码 原因短语
首部字段名: 字段值
(空行)
消息体(可选)

比如:

RTSP/1.0 200 OK
CSeq: 4
Session: 12345678
RTP-Info: url=rtsp://example.com/video.mp4/track1;seq=9810;rtptime=3450012

标准交互流程

一个典型的 RTSP 推流会话,通常走这五步:

  1. OPTIONS:客户端询问服务器支持哪些方法。
  2. DESCRIBE:客户端请求媒体描述信息(SDP)。
  3. SETUP:客户端为每个媒体流建立传输通道。
  4. PLAY:客户端请求开始播放。
  5. TEARDOWN:客户端请求结束会话。

避坑指南:我曾经遇到过一个摄像头,它的 OPTIONS 响应里没返回 SETUP 方法。结果客户端一直发 SETUP,服务器一直回 405。折腾了半天才发现是固件 bug。所以,第一步 OPTIONS 的响应一定要仔细检查。

下面这张图展示了完整的交互流程:

RTSP 推流交互流程 客户端(推流端) RTSP 服务器 ① OPTIONS 200 OK(支持的方法列表) ② DESCRIBE 200 OK(SDP 描述) ③ SETUP(传输参数) 200 OK(会话 ID + 端口) ④ PLAY 200 OK(开始推流) RTP 数据流 RTP 接收端 RTP 音视频数据(UDP) RTCP 质量反馈 ⑤ TEARDOWN 200 OK(会话结束) 注意:实际项目中 SETUP 可能多次调用(每个媒体轨道一次),PLAY 也可带 Range 参数实现点播

SDP 协议基础

SDP(Session Description Protocol)不是传输协议,而是一种描述格式。它告诉接收端:媒体是什么编码、用什么端口、采样率多少等等。

一个典型的 SDP 长这样:

v=0
o=- 123456 789012 IN IP4 192.168.1.100
s=RTSP Session
c=IN IP4 0.0.0.0
t=0 0
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=42e01f;sprop-parameter-sets=Z0IACpZUBQFs, aMljiA==
m=audio 0 RTP/AVP 97
a=rtpmap:97 MPEG4-GENERIC/16000/1
a=fmtp:97 streamtype=5;profile-level-id=1;mode=AAC-hbr;config=1408

这里有几个关键字段:

字段 含义 示例
v= 协议版本 v=0
o= 会话发起者信息 o=- 123456 789012 IN IP4 192.168.1.100
s= 会话名称 s=RTSP Session
c= 连接信息 c=IN IP4 0.0.0.0
t= 会话时间 t=0 0(表示无限制)
m= 媒体描述 m=video 0 RTP/AVP 96
a= 属性行 a=rtpmap:96 H264/90000

个人经验:SDP 里的 sprop-parameter-sets 字段特别重要。它包含了 H.264 的 SPS 和 PPS。如果这个字段丢了或者错了,解码器直接罢工。我遇到过好几次,推流端没带这个参数,接收端画面全黑。排查起来特别头疼。

小结

RTSP 协议基础就聊到这儿。记住三件事:

  • RTSP 是控制协议,RTP 是传输协议,RTCP 是反馈协议。
  • 交互流程走五步:OPTIONS → DESCRIBE → SETUP → PLAY → TEARDOWN。
  • SDP 是媒体描述,里面藏着编码参数和传输配置。

这些基础打牢了,后面聊性能瓶颈才有底气。你想想看,连协议交互都搞不清楚,怎么优化推流延迟?