Loading

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 服务器,远不止"转发":

  1. 会话与鉴权:维护 Session 表、超时回收、Basic/Digest 认证、按 IP 或账号做权限。
  2. 协议转换:把 RTSP 输入转成 RTMP/HLS/HTTP-FLV/WebRTC/SRT 输出,这是它最有价值的部分——因为浏览器不认 RTSP。
  3. 拉流与推流:既能等设备推上来(push),也能主动去设备拉(pull)。
  4. GOP 缓存:缓存最近一个关键帧组,新观众进来立刻能出画面,不用等下一个 I 帧。这是"秒开"的关键。
  5. 按需拉流:没人看的时候不占设备的连接数,有人看才去拉,省带宽也省摄像头的并发额度。
  6. 录制与截图:按时间切片落盘,或定时截图。
  7. 集群与级联:多台服务器之间转发,做负载均衡和跨地域分发。

六、哪些生产场景真的在用它

场景为什么用 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 服务器这件事,记住三句话就够了:

  1. RTSP 管控制,RTP 管传输,SDP 管描述。 分层清楚,排查才不会南辕北辙。
  2. 它的价值不在"转发",在"一次采集、多协议分发"。 浏览器不认 RTSP,所以协议转换才是生产环境的核心能力。
  3. 选型看场景,不看热度。 内网低延迟用 RTSP,网页大并发用 HLS,网页超低延迟用 WebRTC,弱网回传用 SRT——真实系统往往是它们的组合。

协议会更新,但这套"控制与承载分离"的设计思路,从 1998 年到现在没变过。

posted @ 2026-11-03 16:25  SaTsuki26681534  阅读(11)  评论(0)    收藏  举报