📹 第一章 流媒体与RTSP/RTP/RTCP简介
📄 一句话概括

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 秒实验

  1. 把你手上任意一台摄像机的 RTSP 地址拆成七段,看用户名密码是不是明文。
  2. 把路径里的通道号改成 102,用播放器打开,比较分辨率和码率的变化。
  3. 把 transportmode 从 unicast 改成 multicast,看还能不能播——很多设备默认关组播。

常见误区

  1. 以为 RTSP 就是「视频流协议」。 它只传信令,画面数据在 RTP 里。 分不清这两件事,抓包永远看不懂。
  2. 以为 RTSP 的 URL 各家都一样。 路径完全由厂商自定义, /Streaming/Channels/101 只是海康的写法,大华宇视都不长这样。
  3. 以为 URL 里带密码是安全的。 明文传输,抓包即可见。 内网可以忍,跨公网必须换 rtsps 或走 ONVIF 认证。
自测三问(点开对答案) 1. RTSP 的「实时」指的是什么? —— 指控制实时——按下暂停立刻停、拖进度立刻响应,不是指数据毫秒必达。数据延迟是 RTP 和缓冲的事。 2. 为什么 URL 里的路径各家不一样? —— RTSP 标准只规定了报文格式,没规定 URL 路径。 每家的通道组织方式不同,所以路径自定义——这正是 ONVIF 要统一的。 3. 101 和 102 差在哪? —— 前一位通道号相同,后两位码流类型不同:01 主码流(高清高码率),02 子码流(低清低码率)。 多画面用子码流省带宽。

下一节把它和 HTTP 的异同摊开,重点是「有状态」这件事带来的一连串后果。

相关笔记