RTSP 服务器:从协议原理到生产选型
RTSP (Real Time Streaming Protocol,实时流传输协议)服务器大概是视频领域最容易被误解的一类组件:名字里带着"音视频流",很多人以为它负责传数据,其实它主要是个遥控器。真正的画面数据走的是另一套协议。搞不清这一层,后面所有关于延迟、丢包、NAT 穿透的问题都会想歪。
这篇文章按"它是什么 → 怎么跑起来 → 用在哪 → 怎么落地 → 和谁比"的顺序讲一遍。
一、一句话定义
RTSP 服务器是一个按 RTSP 协议接受"播放控制指令",并按 SDP 描述的格式把音视频码流(RTP)分发给客户端的服务程序。
它解决的核心问题是:一次采集,多方观看——摄像头只推一路流,几十个客户端都要看,还要能随时暂停、跳转、切换码流。中间这个"分发 + 控制"的角色,就是 RTSP 服务器。
二、协议家族:RTSP 只负责"遥控"
这是理解 RTSP 的第一道关。它不是一个协议,是一组:
| 协议 | 职责 | 类比 |
|---|---|---|
| RTSP | 建立会话、下达 PLAY/PAUSE/TEARDOWN 等控制指令 | 遥控器 |
| SDP | 描述"这个流里有什么":编码格式、分辨率、时钟频率 | 节目单 |
| RTP | 真正承载音视频数据包 | 快递车 |
| RTCP | 回传丢包率、抖动、同步信息,做质量反馈 | 物流回执 |
对应的标准:RTSP 1.0 是 RFC 2326(1998),RTSP 2.0 是 RFC 7826(2016);RTP/RTCP 见 RFC 3550;SDP 见 RFC 4566;H.264 的 RTP 打包规则是 RFC 6184,H.265 是 RFC 7798。
关键点:RTSP 本身不传画面。 你看到的花屏、卡顿、马赛克,绝大多数是 RTP 层或网络层的问题,跟 RTSP 信令没关系。反过来,连不上、401、404、SETUP 失败,才是 RTSP 层的问题。排查时先分清在哪一层,能省掉一半时间。
三、一次完整的会话长什么样
RTSP 是文本协议,长得像 HTTP,报文可以直接用眼睛读。一次正常的点播大致是这个过程:
客户端 服务器
| OPTIONS ------------------------> | 探测支持的方法
| <------------------------ 200 OK |
| DESCRIBE ------------------------> | 我要看这个地址
| <---------------- 200 OK + SDP | 这是节目单
| SETUP (trackID=1) ---------------> | 视频走这条通道
| <------------- 200 OK + Session |
| SETUP (trackID=2) ---------------> | 音频走这条通道
| <------------- 200 OK + Session |
| PLAY ----------------------------> | 开始播
| <------------- 200 OK + RTP-Info |
| <==== RTP 视频/音频数据流 ========= | 数据从另一条通道走
| <==== RTCP 质量反馈 ============== |
| OPTIONS / GET_PARAMETER ---------> | 心跳保活
| TEARDOWN ------------------------> | 结束
真实的 DESCRIBE 请求与响应(地址是常见的海康通道格式,具体以设备为准):
DESCRIBE rtsp://192.168.1.64:554/Streaming/Channels/101 RTSP/1.0
CSeq: 2
Accept: application/sdp
User-Agent: LibVLC/3.0.20
RTSP/1.0 200 OK
CSeq: 2
Content-Type: application/sdp
Content-Length: 486
v=0
o=- 1463213325 1 IN IP4 192.168.1.64
s=Media Presentation
t=0 0
a=control:*
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;sprop-parameter-sets=Z2QAH6zZQFAFuhAAAAMAEAAAAwPI8YMZYA==,aO48gA==
a=control:trackID=1
m=audio 0 RTP/AVP 8
a=control:trackID=2
几个细节值得注意:
m=video 0里的0表示端口由 SETUP 阶段协商,不是固定值。a=control:trackID=1是每条轨道的相对地址,SETUP 时拼在会话 URL 后面。sprop-parameter-sets是 H.264 的 SPS/PPS,客户端拿它才能立刻解码,不用等关键帧。CSeq是请求序号,必须逐条递增,服务器靠它匹配响应。
SETUP 决定了数据走哪条路:
SETUP rtsp://192.168.1.64:554/Streaming/Channels/101/trackID=1 RTSP/1.0
CSeq: 3
Transport: RTP/AVP/TCP;unicast;interleaved=0-1
RTSP/1.0 200 OK
CSeq: 3
Session: 3A5F8C21;timeout=60
Transport: RTP/AVP/TCP;unicast;interleaved=0-1
Session 这个头之后每个请求都要带上,timeout=60 意味着 60 秒内没有心跳,服务器会把这个会话回收——这就是很多"画面突然定住"的真凶。
四、三种传输方式,决定了你的网络体验
| 方式 | 做法 | 优点 | 缺点 |
|---|---|---|---|
| UDP(默认) | RTP 走独立 UDP 端口对 | 延迟最低、开销小 | 丢包花屏、NAT/防火墙极难穿 |
| TCP 交织(interleaved) | RTP 复用在同一 RTSP 连接里 | 一个端口搞定、防火墙友好、不丢包 | 队头阻塞,弱网延迟反而升高 |
| 组播(multicast) | 一份流发给一组地址 | 带宽与人数无关 | 需要网络设备支持,跨网段困难 |
端口约定:RTSP 控制端口默认 554(TLS 版 RFC 定义是 322,实际部署常用 322/443);自建服务常用 8554。UDP 模式下,RTP 用偶数端口、RTCP 用紧随其后的奇数端口,且是动态协商的。
TCP 交织模式下,数据包和 RTSP 信令共用一个连接,靠一个极简的帧头区分:
0x24 ('$') | channel(1 字节) | length(2 字节) | payload
channel 就是 SETUP 里协商的 interleaved=0-1 中的 0 和 1(0 传 RTP,1 传 RTCP)。抓包时看到以 24 开头的 TCP 段,那就是媒体数据。
实践建议:公网、跨防火墙、以及"能播就行别花屏"的场景,一律先上 TCP:
ffplay -rtsp_transport tcp rtsp://192.168.1.64:554/Streaming/Channels/101
五、服务器内部到底在做什么
一个生产级的 RTSP 服务器,远不止"转发":
- 会话与鉴权:维护 Session 表、超时回收、Basic/Digest 认证、按 IP 或账号做权限。
- 协议转换:把 RTSP 输入转成 RTMP/HLS/HTTP-FLV/WebRTC/SRT 输出,这是它最有价值的部分——因为浏览器不认 RTSP。
- 拉流与推流:既能等设备推上来(push),也能主动去设备拉(pull)。
- GOP 缓存:缓存最近一个关键帧组,新观众进来立刻能出画面,不用等下一个 I 帧。这是"秒开"的关键。
- 按需拉流:没人看的时候不占设备的连接数,有人看才去拉,省带宽也省摄像头的并发额度。
- 录制与截图:按时间切片落盘,或定时截图。
- 集群与级联:多台服务器之间转发,做负载均衡和跨地域分发。
六、哪些生产场景真的在用它
| 场景 | 为什么用 RTSP | 典型形态 |
|---|---|---|
| 安防监控 | 几乎所有 IPC/NVR 的原生输出就是 RTSP | 摄像头 → NVR/平台 → 客户端 |
| 国标联网(GB/T 28181) | 信令走 SIP,媒体走 RTP/PS,落地时常转 RTSP 分发 | 平安城市、教育、园区 |
| 超低延迟直播 | 端到端延迟可压到几百毫秒 | 赛事、手术示教、庭审 |
| 无人机/机器人图传 | 设备侧算力有限,RTSP 开销小 | 巡检、测绘、农业 |
| 工业质检与 AI 推理 | 推理框架直接吃 RTSP 流 | 产线相机 → 算法 → 报警 |
| 医疗 | 手术示教、内窥镜影像多端同看 | 手术室 → 示教室 |
| 广电与演播 | 台内低延迟信号调度 | 摄像机 → 导播台 |
其中"AI 推理接流"值得单独说:OpenCV、GStreamer、DeepStream、FFmpeg 这类工具对 RTSP 的支持是最成熟的,cv2.VideoCapture("rtsp://...") 一行就能拉流。这也是 RTSP 在算法侧长期不可替代的原因。
七、具体怎么用
1. 选一个服务端
| 方案 | 语言 | 特点 |
|---|---|---|
| MediaMTX | Go | 单二进制、零依赖、配置极简,RTSP/RTMP/HLS/WebRTC/SRT 全覆盖,适合快速落地 |
| ZLMediaKit | C++ | 国产、生态全、GB28181 支持好,适合国内安防项目 |
| SRS | C++ | 直播场景成熟,社区活跃 |
| Live555 | C++ | 老牌参考实现,适合学习协议细节 |
GStreamer gst-rtsp-server |
C | 适合嵌入到自己的流水线里 |
| Wowza / Ant Media | Java | 商业方案,有技术支持 |
个人项目或中小规模,MediaMTX 基本是最省事的选择。
2. 起一个服务
docker run --rm \
-p 8554:8554 -p 1935:1935 -p 8888:8888 -p 8889:8889 -p 8890:8890/udp \
bluenviron/mediamtx
默认就开了 RTSP(8554)、RTMP(1935)、HLS(8888)、WebRTC(8889)、SRT(8890)。配置文件 mediamtx.yml 里最常改的是路径与来源:
paths:
cam1:
# 主动去摄像头拉流
source: rtsp://admin:password@192.168.1.64:554/Streaming/Channels/101
live:
# 等待外部推流上来
source: publisher
3. 推流与拉流
# 推一路本地文件循环播放(模拟直播源)
ffmpeg -re -stream_loop -1 -i demo.mp4 -c:v copy -c:a copy \
-f rtsp rtsp://127.0.0.1:8554/live
# 拉流播放
ffplay -rtsp_transport tcp rtsp://127.0.0.1:8554/live
# 不播放,只探测流信息
ffprobe -v error -rtsp_transport tcp -show_streams rtsp://127.0.0.1:8554/live
4. 常见设备地址格式
海康:rtsp://用户名:密码@IP:554/Streaming/Channels/101 # 101 主码流,102 子码流
大华:rtsp://用户名:密码@IP:554/cam/realmonitor?channel=1&subtype=0
不同型号、不同固件版本会有差异,生产上别硬编码,做成可配置的模板。
5. 上线前必须处理的几件事
- 鉴权:别裸奔。RTSP 的 Basic 认证是明文传输,公网务必配 TLS(
rtsps://)。 - 心跳:客户端要定期发
OPTIONS或GET_PARAMETER,否则会话被回收。 - GOP:关键帧间隔建议 1~2 秒。太长会导致秒开失败,太短会涨码率。
- 时钟:多路流做同步时,设备时钟必须统一,否则 RTCP 的 NTP 时间戳对不上。
- 并发:摄像头通常只允许 4~8 路并发,务必用服务器的"按需拉流 + 一路多用"来扛,而不是每来一个观众就去拉一次。
八、替代方案与对比
这是选型时最容易吵起来的部分。先给结论:没有全能协议,只有匹配场景的协议。
| 协议 | 定位 | 典型延迟 | 浏览器原生播放 | 网络友好度 | 适合 |
|---|---|---|---|---|---|
| RTSP/RTP | 控制 + 实时传输 | 亚秒级 | 否 | UDP 差 / TCP 可 | 安防、设备接入、AI 取流 |
| RTMP | 推流为主 | 1~3 秒 | 否(需转封装) | 好(TCP) | 直播推流、OBS |
| HLS | 切片分发 | 6~30 秒;LL-HLS 2~5 秒 | 是 | 极好(HTTP) | 点播、大并发观看 |
| MPEG-DASH | 切片分发 | 同 HLS | 部分(需 MSE) | 极好 | 国际化、多码率自适应 |
| WebRTC | 实时通信 | 200~500 毫秒 | 是 | 需 STUN/TURN | 视频会议、超低延迟观看 |
| SRT | 点对点传输 | 100~500 毫秒可调 | 否 | UDP,需开端口 | 远距离回传、弱网 |
| GB/T 28181 | 国标联网 | 取决于承载网 | 否 | 专网 | 公安、政务联网 |
| MPEG-TS 组播 | 广播式分发 | 低 | 否 | 组播受限 | IPTV、有线电视 |
几个容易踩的认知误区:
- RTSP 不能直接在浏览器里播。 浏览器只认 HLS/DASH/WebRTC/FLV(且 FLV 要靠 flv.js 这类库)。想让网页看 RTSP,必须由服务端转协议。
- RTMP 正在退场,但没退干净。 推流端生态还在,播放端基本都转向了 HTTP-FLV/HLS/WebRTC。
- HLS 延迟不是"优化一下就好"。 它的分片机制决定了基础延迟,LL-HLS 能压到 2~5 秒,但要服务端和播放器同时支持。
- WebRTC 延迟最低,但成本和复杂度最高。 NAT 穿透、TURN 中转带宽、编码兼容性,都是实打实的工程负担。
怎么选
- 只在内网/专网、要低延迟、客户端是桌面软件或解码器 → RTSP
- 要给网页用户看,延迟要求不苛刻 → HLS
- 要给网页用户看,且必须低延迟 → WebRTC
- 弱网、远距离、跨公网回传 → SRT
- 对接公安/政务平台 → GB/T 28181
- 只做直播推流 → RTMP(推流端)+ 服务端转 HLS/FLV
更常见的真实架构不是"二选一",而是一进多出:
摄像头 --RTSP--> 媒体服务器 --+--> RTSP(内网客户端、算法)
+--> WebRTC(网页低延迟)
+--> HLS(大并发、回看)
+--> 录制文件(归档)
九、常见坑速查
| 现象 | 大概率原因 |
|---|---|
| 连不上,超时 | 端口没开、IP 错、设备没启用 RTSP |
| 401 Unauthorized | 账号密码错,或设备只允许 Digest 认证 |
| 404 Not Found | 通道号/路径不对,型号差异最大 |
| SETUP 失败 | Transport 头不被支持,试试强制 TCP |
| 播几秒就断 | 没发心跳,Session 超时被回收 |
| 画面花屏 | UDP 丢包,改 TCP 或降码率 |
| 首帧很慢 | GOP 太长,或服务端没做 GOP 缓存 |
| 声音画面不同步 | 时间戳/时钟问题,检查 RTCP 与设备时钟 |
十、小结
RTSP 服务器这件事,记住三句话就够了:
- RTSP 管控制,RTP 管传输,SDP 管描述。 分层清楚,排查才不会南辕北辙。
- 它的价值不在"转发",在"一次采集、多协议分发"。 浏览器不认 RTSP,所以协议转换才是生产环境的核心能力。
- 选型看场景,不看热度。 内网低延迟用 RTSP,网页大并发用 HLS,网页超低延迟用 WebRTC,弱网回传用 SRT——真实系统往往是它们的组合。
协议会更新,但这套"控制与承载分离"的设计思路,从 1998 年到现在没变过。

浙公网安备 33010602011771号