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 推流会话,通常走这五步:
- OPTIONS:客户端询问服务器支持哪些方法。
- DESCRIBE:客户端请求媒体描述信息(SDP)。
- SETUP:客户端为每个媒体流建立传输通道。
- PLAY:客户端请求开始播放。
- TEARDOWN:客户端请求结束会话。
避坑指南:我曾经遇到过一个摄像头,它的 OPTIONS 响应里没返回 SETUP 方法。结果客户端一直发 SETUP,服务器一直回 405。折腾了半天才发现是固件 bug。所以,第一步 OPTIONS 的响应一定要仔细检查。
下面这张图展示了完整的交互流程:
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 是媒体描述,里面藏着编码参数和传输配置。
这些基础打牢了,后面聊性能瓶颈才有底气。你想想看,连协议交互都搞不清楚,怎么优化推流延迟?