RTSP 是「遥控器」,不是「运输车」。 它负责按播放、暂停、拖进度,真正搬画面的活交给 RTP。
上一节把「流」和「文件」分开了,这一节开始讲第一个协议。 先把它「是什么、管什么、地址怎么拼」立住,后面 1.2.2 讲特点、1.3 讲流程、1.4 讲概念、 1.5 讲方法。 播放器那一侧的实现看 34 课 ,那一本讲的 FFplay 就是拿 RTSP 当输入源的。
一、名字里的 RTS 是什么意思
RTSP 全称 Real Time Streaming Protocol,实时流协议。 注意「实时」指的是控制实时,不是传输实时——它保证的是「你按下暂停,我立刻停」, 不是「数据毫秒必达」。
它由 RealNetworks 和 Netscape 在 1996 年提出来,RFC 2326 定稿。设计时刻意模仿 HTTP:文本格式、 请求响应、方法动词,所以会用 HTTP 的人看 RTSP 报文几乎不用学。
但有一处根本不同:HTTP 是一次请求一次响应就完事, RTSP 要保持一段会话——因为播放本身是个持续状态。
二、URL 长什么样
RTSP 的 URL 结构和 HTTP 一模一样,只是协议头不同。
| 成分 | 写法 | 说明 |
|---|---|---|
| 协议 | rtsp:// | 加密时是 rtsps:// |
| 认证 | 用户名:密码@ | 明文,抓包就能看到 |
| 主机 | 192.168.1.64 | IP 或域名 |
| 端口 | :554 | 省略时默认 554 |
| 路径 | /Streaming/Channels/101 | 通道与码流 |
| 参数 | ?transportmode=unicast | 传输模式等 |
路径那一段各家设备自己定,没有统一标准:
海康是 /Streaming/Channels/101,大华是 /cam/realmonitor?channel=1,宇视又是另一种。
这就是 ONVIF 要解决的问题——让客户端不用猜每家的路径。
三、它管哪些事
RTSP 管五件事,全部围绕「怎么放」:
| 管什么 | 用什么方法 | 说明 |
|---|---|---|
| 探能力 | OPTIONS | 问对方支持哪些方法 |
| 要参数 | DESCRIBE | 拿 SDP,知道有几路流、什么编码 |
| 建通道 | SETUP | 给每路流分配传输方式与端口 |
| 控播放 | PLAY/PAUSE | 开始、恢复、暂停 |
| 收摊 | TEARDOWN | 释放端口与会话 |
它不管的是「数据怎么走」:包多大、序号怎么排、丢包了怎么办,全都是 RTP 的事。 这条分工必须记牢——面试、排障、看抓包,第一步都是先分清「这是信令问题还是媒体问题」。
四、和 HTTP 的对照
形似神不似,这张表值得存下来:
| HTTP | RTSP | |
|---|---|---|
| 端口 | 80/443 | 554/322 |
| 格式 | 文本 | 文本,同款 |
| 状态 | 无状态 | 有状态(Session) |
| 方法 | GET/POST 等 | 11 个,见 01.05 |
| 典型连接 | 短连接 | 长连接,整场不断 |
| 数据 | 自己就是数据 | 数据在 RTP 里 |
最容易混的是最后一行:HTTP 的 GET 拿到的是内容本体, RTSP 的 DESCRIBE 拿到的只是「说明书」,本体要另开 UDP 通道。
五、谁在用 RTSP
RTSP 的主战场是安防,其次是有线电视和部分流媒体服务器。
| 场景 | 用不用 RTSP | 为什么 |
|---|---|---|
| 安防摄像头 | 用,几乎是事实标准 | 要控制 PTZ、要低延迟 |
| 网络直播 | 少用 | 要穿透、要 CDN,HLS/HTTP-FLV 更合适 |
| 视频会议 | 不用 | 要双向,走 SIP/WebRTC |
| IPTV | 早期用过 | 现在多为 HLS 与组播 |
为什么直播不用 RTSP:它是为「点对点控制」设计的,没有 CDN 分发、没有穿透方案、端口还一堆。 为什么监控离不开它:局域网、路数固定、要低延迟、要能控云台——正好是它的强项。
六、动手 Demo:RTSP 的 URL 里装了几样东西
这段拿一条真实的海康取流地址,用标准库把每一段拆开。 不是手写解析,是 urlsplit 真拆——所以拆出来的就是浏览器和播放器看到的东西。
from urllib.parse import urlsplit
u2 = urlsplit(CAM) # rtsp://admin:[email protected]:554/...
T([u"协议头", u2.scheme, u"rtsp 固定 554"], [0, 0, 0])
T([u"用户名", u2.username or u"(空)", u"多数 IPC 默认 admin"], [0, 0, 0])
T([u"密码", u"*" * len(u2.password), u"真实密码不上屏"], [0, 0, 0])
T([u"主机", u2.hostname, u"IP 或域名"], [0, 0, 0])
T([u"端口", u"%d" % (u2.port or 554), u"省略按默认"], [0, 0, 0])
T([u"路径", u2.path, u"通道号藏在这里"], [0, 0, 0])
T([u"查询串", u2.query, u"传输模式与码流"], [0, 0, 0])
实跑输出:
--------------------------------------------------------------------
RTSP 的 URL 里装了几样东西
--------------------------------------------------------------------
**RTSP 的 URL 长得像 HTTP,但端口、路径、查询串各有各的用法。**
这是一台海康摄像机的典型取流地址,逐段拆开看:
rtsp://admin:[email protected]:554/Streaming/Channels/101?transportmode=unicast&profile=Profile_1
成分 值 说明
---------------------------------------------------------------------------------
协议头 rtsp rtsp 固定 554,rtsps 是 322
用户名 admin 多数 IPC 默认 admin
密码 *** 真实密码不上屏
主机 192.168.1.64 IP 或域名
端口 554 省略时按协议默认
路径 /Streaming/Channels/101 通道号藏在这里
查询串 transportmode=unicast&profile=Pro… 传输模式与码流类型
**路径里那串数字是通道号,不是随便编的:**
`/Streaming/Channels/101` 拆成 `1` 和 `01`——前一位是通道,后两位是码流(01 主码流、02 子码流)。
所以同一台机器,`102` 就是同一个镜头的子码流,分辨率更低、码率更小。
**查询串里两个参数各管一件事:**
参数 取值 影响什么
---------------------------------------------------------------------------
transportmode unicast/multicast 单播还是组播,决定谁复制数据
profile Profile_1/Profile_2 选哪套编码参数
**这条 URL 一共 96 个字符。**
里面明文写着密码,96 个字符里有 3 个是密码。
**抓一次包就等于拿到密码**——这就是为什么 RTSP 在内网用得多、公网要用 rtsps 的原因。
urlsplit 连密码都给你拆出来了,这一点值得停一下:
它说明「URL 里带认证信息」是协议层面的常规做法,不是野路子。
代价是密码完全明文——抓一次包、看一眼日志、复制一条链接,密码就出去了。
所以生产环境要么用 rtsps,要么把认证放到 ONVIF 那一层做。
路径里那串 101 是本节最有用的一个细节:前一位是通道号,后两位是码流类型(01 主码流、
02 子码流)。
同一台机器,102 就是同一个镜头的低清版,多画面轮巡时客户端都拿子码流,
点开单画面才切主码流——这是省带宽最有效的一招。
查询串里的 transportmode=unicast 决定单播还是组播。
单播是「每人一份」,组播是「一份多人收」。
一台交换机下二十个人看同一个镜头,单播要发二十份,组播只发一份——这是组播存在的唯一理由。
30 秒实验
- 把你手上任意一台摄像机的 RTSP 地址拆成七段,看用户名密码是不是明文。
- 把路径里的通道号改成 102,用播放器打开,比较分辨率和码率的变化。
- 把 transportmode 从 unicast 改成 multicast,看还能不能播——很多设备默认关组播。
常见误区
- 以为 RTSP 就是「视频流协议」。 它只传信令,画面数据在 RTP 里。 分不清这两件事,抓包永远看不懂。
- 以为 RTSP 的 URL 各家都一样。 路径完全由厂商自定义,
/Streaming/Channels/101只是海康的写法,大华宇视都不长这样。 - 以为 URL 里带密码是安全的。 明文传输,抓包即可见。 内网可以忍,跨公网必须换 rtsps 或走 ONVIF 认证。
自测三问(点开对答案)
1. RTSP 的「实时」指的是什么? —— 指控制实时——按下暂停立刻停、拖进度立刻响应,不是指数据毫秒必达。数据延迟是 RTP 和缓冲的事。 2. 为什么 URL 里的路径各家不一样? —— RTSP 标准只规定了报文格式,没规定 URL 路径。 每家的通道组织方式不同,所以路径自定义——这正是 ONVIF 要统一的。 3. 101 和 102 差在哪? —— 前一位通道号相同,后两位码流类型不同:01 主码流(高清高码率),02 子码流(低清低码率)。 多画面用子码流省带宽。下一节把它和 HTTP 的异同摊开,重点是「有状态」这件事带来的一连串后果。
- ☐ (本节完,下一节 01.02.02 RTSP特点)