1. RTSP协议基础:从一次推流失败说起
各位同学好,我是老张。做流媒体这行十几年了,RTSP 算是我打交道最多的协议之一。记得刚入行那会儿,有次线上直播突然卡死,我抓了包一看——RTSP 的 PLAY 请求根本没发出去。嗯,从那以后我就明白,搞推流调试,RTSP 协议基础必须吃透。
这一章咱们就聊聊 RTSP 的核心概念。说白了,RTSP 就是控制流媒体播放的“遥控器”,它不负责传视频数据,只管“播放、暂停、快进”这些命令。你想想看,没有遥控器,电视怎么换台?
1.1 RTSP协议概述
RTSP(Real Time Streaming Protocol)是 IETF 在 RFC 2326 中定义的。它是个应用层协议,默认端口 554。我个人的理解是:它像 HTTP 的亲戚,但专门为流媒体设计。
核心特点:
- 有状态协议:服务器会记住每个会话的状态(不像 HTTP 那样无状态)
- 文本协议:消息可读性强,调试时直接用 telnet 就能看
- 支持多种传输方式:UDP、TCP、HTTP 隧道都能跑
我在项目中遇到过最典型的场景:客户端发一个 DESCRIBE 请求,服务器返回 SDP 描述,然后客户端解析出视频编码格式、分辨率、帧率等信息。这一步要是错了,后面全白搭。
1.2 RTSP与RTP/RTCP的关系
很多新手搞混这三者的关系。我画个图你就明白了:
简单来说:
- RTSP:负责建立和控制会话(SETUP、PLAY、PAUSE、TEARDOWN)
- RTP:负责传输实际的音视频数据(H.264、AAC 等)
- RTCP:负责反馈传输质量(丢包率、延迟、抖动)
我的调试经验:抓包时先看 RTSP 交互是否完整,再看 RTP 序列号是否连续,最后看 RTCP 的丢包率。这个顺序能帮你快速定位问题。
1.3 RTSP消息格式与交互流程
RTSP 消息分两种:请求和响应。格式跟 HTTP 很像,但方法不同。
请求消息格式
方法 URI RTSP版本
头字段: 值
空行
消息体(可选)
常用的方法有:
| 方法 | 作用 | 我在项目中踩过的坑 |
|---|---|---|
| DESCRIBE | 获取媒体描述(SDP) | 服务器返回 404 时,检查 URL 路径 |
| SETUP | 建立传输通道 | 端口号冲突导致 SETUP 失败 |
| PLAY | 开始播放 | Range 头格式不对,服务器不理你 |
| PAUSE | 暂停播放 | 某些摄像头不支持 PAUSE |
| TEARDOWN | 终止会话 | 忘记发这个,服务器资源泄漏 |
典型交互流程
我习惯把 RTSP 交互比作打电话:
- OPTIONS:先问问对方支持什么(“喂,你会说中文吗?”)
- DESCRIBE:看看对方有什么内容(“你那边有什么节目?”)
- SETUP:确定用什么通道传数据(“咱们用还是QQ传?”)
- PLAY:开始传数据(“开始放吧!”)
- TEARDOWN:挂断(“拜拜”)
曾经有个坑:我调试某款 IPC 摄像头时,发现它要求必须先发 OPTIONS 才能 DESCRIBE,否则直接返回 400。后来查文档才知道,这是 RTSP 1.0 的兼容性问题。所以建议你写客户端时,永远先发 OPTIONS。
完整交互示例
C: OPTIONS rtsp://192.168.1.100:554/stream1 RTSP/1.0
CSeq: 1
User-Agent: MyRTSPClient/1.0
S: RTSP/1.0 200 OK
CSeq: 1
Public: DESCRIBE, SETUP, PLAY, PAUSE, TEARDOWN
C: DESCRIBE rtsp://192.168.1.100:554/stream1 RTSP/1.0
CSeq: 2
Accept: application/sdp
S: RTSP/1.0 200 OK
CSeq: 2
Content-Type: application/sdp
Content-Length: 120
v=0
o=- 123456 789012 IN IP4 192.168.1.100
s=Live Stream
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
C: SETUP rtsp://192.168.1.100:554/stream1/track1 RTSP/1.0
CSeq: 3
Transport: RTP/AVP/UDP;unicast;client_port=8000-8001
S: RTSP/1.0 200 OK
CSeq: 3
Transport: RTP/AVP/UDP;unicast;client_port=8000-8001;server_port=9000-9001
Session: 12345678
C: PLAY rtsp://192.168.1.100:554/stream1 RTSP/1.0
CSeq: 4
Session: 12345678
Range: npt=0.000-
S: RTSP/1.0 200 OK
CSeq: 4
Session: 12345678
RTP-Info: url=rtsp://192.168.1.100:554/stream1/track1;seq=12345;rtptime=987654
关键点总结:
- CSeq 必须递增,服务器靠它匹配请求和响应
- Session ID 在 SETUP 后获得,后续请求都要带上
- Transport 头决定了 RTP 走 UDP 还是 TCP
- Range 头控制播放位置,格式是 npt=开始时间-结束时间
嗯,到这里 RTSP 协议基础就讲完了。说白了就是三件事:控制命令、数据通道、质量反馈。你把这个三角关系理清了,后面调试流控就顺手多了。