2. RTSP协议基础

RTSP(Real Time Streaming Protocol,实时流传输协议)是流媒体部署中最常被误解的一层协议。很多初学者以为“RTSP 就是传视频的协议”,实际上 RTSP 本身不承载音视频数据,它更像一个“远程录像机遥控器”:负责建立会话、描述媒体、控制播放,而真正的音视频码流由 RTP 承载、由 RTCP 反馈质量。理解这一分工,是后续排查音画不同步问题的前提。

一、RTSP 的定位:控制面与数据面分离

RTSP 工作在应用层,默认端口 554,语法风格接近 HTTP,但它是有状态的:一次会话会持续存在,直到被 TEARDOWN 或超时。它把“控制”和“传输”拆成两条链路:

  • 控制面(RTSP):DESCRIBE、SETUP、PLAY、PAUSE、TEARDOWN 等方法,负责协商和指挥。
  • 数据面(RTP/RTCP):RTP 传输音视频包,RTCP 周期性发送发送者报告(SR)和接收者报告(RR),携带 NTP 时间戳与 RTP 时间戳的对应关系。

音画同步的关键信息——RTP 时间戳与绝对时间的映射——正是通过 RTCP SR 传递的,而不是 RTSP。因此只抓 RTSP 报文无法定位同步问题,必须同时抓 RTP/RTCP。

二、RTSP 常用方法与 URL 格式

RTSP URL 的典型格式为:

rtsp://[用户名:密码@]主机[:端口]/路径[?参数]

示例:
rtsp://admin:pass123@192.168.1.64:554/Streaming/Channels/101
rtsp://camera.local/live/ch0
rtsp://10.0.0.8:8554/test.mp4

其中路径部分由服务端定义,海康、大华、ONVIF 设备的通道路径各不相同,部署时必须以设备文档为准。常用方法如下表:

方法方向作用是否必需
OPTIONSC→S查询服务端支持的方法可选
DESCRIBEC→S获取 SDP 媒体描述必需
SETUPC→S建立传输通道,协商 RTP/RTCP 端口必需
PLAYC→S启动或恢复播放必需
PAUSEC→S暂停,保留会话可选
TEARDOWNC→S结束会话,释放资源推荐
GET_PARAMETERC→S保活或查询参数可选

三、典型会话流程

一次完整的 RTSP 交互通常按 OPTIONS → DESCRIBE → SETUP → PLAY →(RTP/RTCP 传输)→ TEARDOWN 的顺序进行。DESCRIBE 返回的 SDP 中会声明媒体类型、编码格式、时钟频率(如 90000)和 control 属性,SETUP 则根据 control 建立具体传输通道。下图展示了控制面与数据面的协作关系:

RTSP 客户端 播放器 / 解码器 RTSP 服务端 摄像机 / 流媒体服务器 控制面(RTSP,TCP 554) OPTIONS 查询支持方法 DESCRIBE 请求 SDP 200 OK + SDP(编码/时钟频率/control) SETUP 协商 RTP/RTCP 端口 200 OK + Session ID PLAY 启动播放 数据面(RTP/RTCP,UDP 或 TCP 交织) RTP 音视频包 → RTCP SR/RR 时间戳映射与丢包反馈 TEARDOWN 结束会话 RTSP 只负责“指挥”,音画同步依赖 RTCP SR 中的 NTP 与 RTP 时间戳对应关系

四、与 RTP/RTCP 的关系及常见交互案例

三者分工可以概括为:RTSP 建会话、RTP 送数据、RTCP 报质量。RTP 包头中的时间戳以采样率为单位递增,例如视频 90000Hz、音频 48000Hz,它本身只是相对时间;RTCP SR 包则携带“这一刻的 NTP 绝对时间”和“对应的 RTP 时间戳”,接收端用这两组值把音视频流对齐到同一时间轴,从而实现唇音同步。

一个常见的部署案例是:使用 FFmpeg 拉取 RTSP 流并转推。命令如下:

ffmpeg -rtsp_transport tcp \
  -i "rtsp://admin:pass123@192.168.1.64:554/Streaming/Channels/101" \
  -c copy -f flv rtmp://127.0.0.1/live/cam1

若此处使用 UDP 传输,在丢包网络下容易出现花屏和音画漂移;改用 TCP 交织传输可提升稳定性,但会引入一定延迟。这是部署中非常典型的取舍。

排查音画不同步时,建议同时抓取 RTSP、RTP、RTCP 三类报文。仅看 RTSP 只能确认会话是否正常建立,无法判断时间戳映射是否正确。

五、常见误区与复盘

  • 误区一:认为 RTSP 传输音视频。实际上 RTSP 只传控制信令,音视频走 RTP,抓包时若只过滤 554 端口会看不到任何码流。
  • 误区二:忽略 Session ID。SETUP 之后的所有请求都必须携带 Session 头,否则服务端返回 454 Session Not Found。
  • 误区三:DESCRIBE 返回的 SDP 中 clock rate 被忽略。时钟频率是时间戳换算的基础,配置错误会直接导致同步偏差。
  • 误区四:不发送 TEARDOWN。会话未释放会占用服务端连接数,长期运行可能导致新连接被拒绝。
部分设备对 OPTIONS 和 GET_PARAMETER 的保活支持不一致。若播放一段时间后自动断开,可尝试用 GET_PARAMETER 或 SET_PARAMETER 作为保活手段,而不是依赖 OPTIONS。