1. 课程导入
各位同学好。我是老张,在流媒体这行摸爬滚打了十多年。今天咱们聊RTSP协议基础,我尽量用大白话把这事讲透。
先讲个故事。2018年我帮某安防厂商做项目,客户要求把2000路摄像头画面实时推送到指挥中心。当时团队有人提议用RTMP,结果上线第一天就崩了——延迟高、连接不稳定,指挥员看到的画面比现场慢了快10秒。后来换成RTSP,问题全解决了。
为什么会这样?因为RTSP天生就是为这种场景设计的。咱们今天就把这事掰开揉碎讲清楚。
1.1 RTSP协议概述
RTSP全称Real Time Streaming Protocol,中文叫实时流协议。它由IETF在1998年标准化,RFC编号2326。说白了,它就是用来控制音视频流的「遥控器」。
你想想看,我们看视频时需要的操作无非就是:播放、暂停、快进、后退、停止。RTSP就是干这个的。它不负责传输视频数据本身,只负责「指挥」——告诉服务器:现在给我发第5秒到第10秒的数据。
核心要点:RTSP是一个应用层协议,默认端口554。它基于文本,类似HTTP的请求/响应模式。但和HTTP最大的区别是——RTSP是有状态的。服务器会记住每个会话的状态:当前播放到哪了、用了什么编码、传输方式是什么。
我刚开始学RTSP时,总把它和RTP搞混。这里澄清一下:RTSP负责控制,RTP负责传输实际音视频数据,RTCP负责质量反馈。三者配合使用,缺一不可。
1.2 RTSP与RTMP/HTTP对比
很多新手会问:市面上这么多流媒体协议,我该选哪个?
我个人习惯,先看场景再选协议。下面这张表是我多年总结的对比,你直接拿去用。
| 特性 | RTSP | RTMP | HTTP(HLS/DASH) |
|---|---|---|---|
| 传输层 | TCP/UDP | TCP | TCP |
| 延迟 | 低(200ms-1s) | 中(1-3s) | 高(5-30s) |
| 状态管理 | 有状态 | 有状态 | 无状态 |
| 控制能力 | 强(播放/暂停/快进) | 弱(仅播放) | 弱(仅播放) |
| 防火墙友好 | 差(需开放554端口) | 中(需开放1935端口) | 好(80/443端口) |
| 典型场景 | 安防监控、IP摄像头 | 直播推流、互动直播 | 点播、OTT、短视频 |
看到没?RTSP在延迟和控制能力上完胜。但代价是防火墙配置麻烦。我在项目中遇到过,客户内网只开放80和443端口,RTSP死活连不上。最后没办法,只能走HTTP隧道。
避坑指南:我曾经在安防项目中,因为没注意RTSP的UDP模式,导致视频花屏。后来发现是防火墙把UDP包丢了。解决方案很简单:强制RTSP走TCP模式。在FFmpeg命令里加 -rtsp_transport tcp 就行。
1.3 RTSP应用场景分析
RTSP不是万能的,但在某些领域,它确实是首选。我按经验排了个优先级:
- 安防监控(第一优先级)
- 海康、大华、宇视的摄像头几乎都支持RTSP
- 延迟要求高:200ms以内
- 需要VCR操作:回放、快进、暂停
- IP电话/视频通话
- 需要双向实时通信
- RTSP配合RTP可以实现低延迟
- 但SIP协议更常用,RTSP偏小众
- 视频点播(VOD)
- 支持Seek操作(跳转到任意时间点)
- 但HLS更流行,因为CDN支持好
- 直播推流
- RTMP是主流,RTSP较少
- 除非你有特殊需求:比如低延迟+控制能力
我个人的经验是:如果你做安防,闭眼选RTSP。如果你做直播,优先考虑RTMP或SRT。如果你做点播,HLS最省心。
注意:RTSP在公网环境下表现不佳。因为UDP穿透困难,TCP模式又容易丢包。我曾经在跨国项目中,RTSP延迟飙到5秒以上。后来改用SRT协议才解决。所以,RTSP更适合局域网或专线环境。
1.4 RTSP协议栈全景图
下面这张图是我手绘的RTSP协议栈结构。你把它存下来,后面章节会反复用到。
嗯,这里要注意:RTSP和RTP是分开的。RTSP走TCP(控制命令),RTP可以走UDP(数据流)。这种分离设计的好处是——控制命令必须可靠,数据流可以容忍少量丢包。
1.5 一个简单的RTSP交互示例
光说不练假把式。咱们看一个真实的RTSP握手过程。假设客户端要播放一个摄像头视频:
客户端 → 服务器:OPTIONS rtsp://192.168.1.100:554/stream1 RTSP/1.0
服务器 → 客户端:RTSP/1.0 200 OK
Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE
客户端 → 服务器:DESCRIBE rtsp://192.168.1.100:554/stream1 RTSP/1.0
服务器 → 客户端:RTSP/1.0 200 OK
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
客户端 → 服务器:SETUP rtsp://192.168.1.100:554/stream1/track1 RTSP/1.0
Transport: RTP/AVP/UDP;unicast;client_port=8000-8001
服务器 → 客户端:RTSP/1.0 200 OK
Transport: RTP/AVP/UDP;unicast;client_port=8000-8001;server_port=9000-9001
Session: 12345678
客户端 → 服务器:PLAY rtsp://192.168.1.100:554/stream1 RTSP/1.0
Session: 12345678
服务器 → 客户端:RTSP/1.0 200 OK
RTP-Info: url=rtsp://192.168.1.100:554/stream1/track1;seq=0;rtptime=0
看到没?整个过程就是「问清楚→要描述→建连接→开始播」。我刚开始调试时,经常卡在SETUP这一步。后来发现是端口没开放。记住:客户端端口和服务器端口必须一一对应。
调试技巧:用Wireshark抓包时,过滤条件写 rtsp 或 rtp。我习惯先抓一次完整的OPTIONS→DESCRIBE→SETUP→PLAY流程,确认每个步骤都返回200 OK。如果某个步骤返回错误码,比如401(未授权),那就检查认证信息。
1.6 本章小结
RTSP协议基础就讲这么多。你记住三件事:
- RTSP是控制协议,不是传输协议
- RTSP适合安防监控、低延迟场景
- RTSP有状态,需要维护会话