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 / RTP / RTCP 关系图 RTSP 控制通道 RTP 数据通道 RTCP 控制通道 客户端 服务器 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 交互比作打电话:

  1. OPTIONS:先问问对方支持什么(“喂,你会说中文吗?”)
  2. DESCRIBE:看看对方有什么内容(“你那边有什么节目?”)
  3. SETUP:确定用什么通道传数据(“咱们用还是QQ传?”)
  4. PLAY:开始传数据(“开始放吧!”)
  5. 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 协议基础就讲完了。说白了就是三件事:控制命令、数据通道、质量反馈。你把这个三角关系理清了,后面调试流控就顺手多了。