音视频修炼之容器与协议(四):RTSP详解

RTSP 协议详解

Real Time Streaming Protocol------摄像头 / 监控行业的"控制面协议"。最重要的一句话:RTSP 负责控制会话,SDP 负责描述媒体,RTP/RTCP 负责真正传音视频。


本文速览

章节 读完要掌握什么
0. RTSP 是啥 RTSP 是媒体控制协议,不是直接承载音视频的媒体协议。
1. 和 RTMP / HTTP / HLS 的差异 分清控制面、媒体面、分发协议的边界。
2. 典型应用 IPC、NVR、DVR、监控平台为什么大量使用 RTSP。
3. URL 格式 看懂用户名、密码、host、port、厂家路径和主/子码流。
4. 完整会话流程 从 OPTIONS 到 TEARDOWN,知道每一步在协商什么。
5. 控制方法 掌握 OPTIONS/DESCRIBE/SETUP/PLAY/PAUSE/TEARDOWN 的作用。
6. 媒体传输模式 RTP over UDP、RTP over TCP interleaved、HTTP tunneling 的取舍。
7. SDP 详解 详细理解 SDP 如何描述 track、codec、payload type、SPS/PPS、AAC 参数。
8. RTP 包格式 知道 RTP header 字段、H.264 FU-A、AAC MPEG4-GENERIC 的基本关系。
9. 鉴权 Basic、Digest、RTSPS 的流程和安全边界。
10. 实战 FFmpeg 如何拉 RTSP、转封装、调试。
11. 用 GStreamer 用 rtspsrc 快速验证 RTSP 拉流链路。
12. 服务端 GStreamer RTSP Server、Live555、ZLMediaKit 等实现选择。
13. 常见坑 连接失败、UDP 丢包、401、RTCP timeout、SDP 不完整怎么排查。
14. RTSP vs ONVIF RTSP 管媒体,ONVIF 管设备;监控行业通常两者配合。
15. 总结 用一张表记住 RTSP/SDP/RTP/ONVIF 的关系。

0. RTSP 是啥

RTSP 的定位可以先按下面这张表记:

维度 说明
全称 Real Time Streaming Protocol。
标准 RTSP 1.0 对应 RFC 2326,RTSP 2.0 对应 RFC 7826。监控行业大量设备仍以 RTSP 1.0 行为为主。
默认端口 554/TCP;很多测试服务也会用 8554。
核心定位 控制播放会话:探测能力、获取媒体描述、建立 RTP 通道、开始/暂停/结束播放。
媒体承载 真正音视频通常由 RTP/RTCP 承载,不是 RTSP 文本消息直接承载。
文本风格 请求/响应格式很像 HTTP:起始行 + Header + 可选 Body。
典型设备 海康、大华、Axis、Bosch、NVR、DVR、监控平台、部分会议系统。

RTSP、SDP、RTP 三者分工:

协议 / 格式 一句话作用 类比
RTSP 控制播放:OPTIONS/DESCRIBE/SETUP/PLAY。 遥控器 / 控制台。
SDP 描述媒体:有几路 track、codec 是什么、payload type 怎么映射。 菜单 / 说明书。
RTP 承载媒体:H.264/AAC 被打进 RTP 包持续发送。 真正的数据传送带。
RTCP 反馈统计:丢包、抖动、同步信息等。 质量反馈通道。

核心金句:RTSP 不直接"传视频",它负责让客户端和摄像头商量好"这路视频怎么传、传到哪个端口、从什么时候开始传"。


1. 跟 RTMP / HTTP / HLS 的本质差异

协议 控制方式 媒体承载 典型端口 典型场景 和 RTSP 的区别
RTSP RTSP 文本请求/响应。 RTP/RTCP over UDP 或 TCP interleaved。 554 IPC/NVR/监控。 控制面和媒体面通常分离。
RTMP AMF 命令。 RTMP Message/Chunk 同连接承载音视频。 1935 直播推流到 CDN。 控制和媒体通常走同一条 TCP 长连接。
HTTP HTTP 请求/响应。 文件、分片、接口响应。 80/443 Web、下载、HLS/DASH。 不是专门的实时媒体控制协议。
HLS/DASH 拉清单 + 拉分片。 TS/fMP4 分片。 80/443 互联网大规模播放。 更适合 CDN 分发,不适合低延迟摄像头控制。
WebRTC SDP/ICE/DTLS/SRTP 等。 SRTP。 动态 互动实时音视频。 延迟更低,但部署和 NAT 穿透更复杂。

2. 典型应用

类型 场景 为什么用 RTSP
适合 IP 摄像头拉流 设备普遍支持,能直接拿主码流/子码流。
适合 NVR / DVR 监控录像系统需要稳定拉取多路摄像头。
适合 监控平台接入 RTSP + ONVIF 是监控行业常见组合。
适合 局域网专业视频 低延迟、可控、设备侧支持广。
一般 互联网跨公网播放 NAT、防火墙、UDP 丢包、浏览器不支持都会增加成本。
不适合 大规模 CDN 分发 HLS/DASH/HTTP-FLV 更适合缓存和海量播放。
不适合 强互动连麦 WebRTC 更适合亚秒级互动。

3. URL 格式

RTSP URL 基本形态:

部分 示例 说明
scheme rtsp / rtsps 明文 RTSP 或 RTSP over TLS。
user:pass admin:12345@ 可选;很多摄像头还会走 Digest challenge,不建议在 URL 明文放密码。
host 192.168.1.100 IPC/NVR/流媒体服务器地址。
port 554 RTSP 默认端口,省略时通常按 554。
path /Streaming/Channels/101 厂商定义的流路径。
query ?channel=1&subtype=0 厂商私有参数,例如通道、码流类型。

常见示例:

厂商 / 场景 URL 示例 说明
海康主码流 rtsp://admin:12345@192.168.1.100:554/Streaming/Channels/101 101 常表示 1 通道主码流,102 常表示子码流。
大华主码流 rtsp://admin:12345@192.168.1.100:554/cam/realmonitor?channel=1&subtype=0 subtype=0 主码流,1 子码流常见。
Axis rtsp://192.168.1.100/axis-media/media.amp Axis 常见路径。
GStreamer 测试服务 rtsp://127.0.0.1:8554/test 本地测试 RTSP Server 常用。

4. 完整会话流程

4.1 标准会话:7 个动作,10 条左右 RTSP 消息

标准 RTSP 拉流流程按"控制消息 + 媒体通道 + RTP 数据"整理成表格更清楚:

步骤 方向 RTSP 方法 / 数据 关键 Header / Body 目的
1 C → S OPTIONS CSeq、User-Agent 查询服务端支持哪些 RTSP 方法。
2 S → C 200 OK Public: OPTIONS, DESCRIBE, SETUP, PLAY... 返回可用方法列表。
3 C → S DESCRIBE Accept: application/sdp 请求媒体描述 SDP。
4 S → C 200 OK + SDP Content-Type: application/sdp 告诉客户端有几路媒体、codec、payload type、track URL。
5 C → S SETUP video track Transport: RTP/AVP;unicast;client_port=8000-8001 为视频 track 协商 RTP/RTCP 端口或 TCP interleaved 通道。
6 S → C 200 OK Session、server_port=6000-6001 返回 Session ID 和服务端媒体端口。
7 C → S SETUP audio track client_port=8002-8003 如果有音频 track,再建一路媒体通道。
8 S → C 200 OK 通常复用同一个 Session 音频通道协商成功。
9 C → S PLAY Session、Range: npt=0.000- 要求服务端开始发送媒体。
10 S → C 200 OK RTP-Info: url=...;seq=...;rtptime=... 告诉客户端 RTP 起始序号和 RTP 时间戳映射。
11 S → C RTP/RTCP 媒体包 UDP 端口或 TCP $ interleaved frame 服务端开始发送音视频。
12 C → S TEARDOWN Session 结束播放并释放服务端会话资源。
13 S → C 200 OK CSeq 确认会话结束。

多 track 的关键点:

情况 正确理解
只有视频 通常只需要对 trackID=0 执行一次 SETUP。
音视频都有 video 和 audio 通常各自 SETUP 一次,但共享同一个 RTSP Session。
多码流摄像头 主码流和子码流通常是不同 URL,不是同一个 SDP 里随便切。
TCP interleaved 不协商 UDP client_port,而是协商 interleaved=0-1 这类通道号。

4.2 OPTIONS:查询支持的方法

请求示例:

http 复制代码
OPTIONS rtsp://192.168.1.100/stream RTSP/1.0
CSeq: 1
User-Agent: VLC/3.0.20

响应示例:

http 复制代码
RTSP/1.0 200 OK
CSeq: 1
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, GET_PARAMETER

字段解释:

字段 位置 作用
OPTIONS 请求行方法 探测服务端支持的 RTSP 方法。
URL 请求行 URI 可以是具体流 URL,也可以是服务根路径,取决于服务端实现。
CSeq 请求/响应 Header RTSP 请求序号;响应必须带回相同 CSeq,便于客户端匹配请求。
User-Agent 请求 Header 客户端标识,例如 VLC、Lavf、LIVE555。
Public 响应 Header 服务端声明支持的方法集合。

4.3 DESCRIBE:拿 SDP 媒体描述

请求示例:

http 复制代码
DESCRIBE rtsp://192.168.1.100/stream RTSP/1.0
CSeq: 2
Accept: application/sdp
User-Agent: Lavf/60.0.0

响应示例:

http 复制代码
RTSP/1.0 200 OK
CSeq: 2
Content-Type: application/sdp
Content-Base: rtsp://192.168.1.100/stream/
Content-Length: 520

v=0
o=- 1234567890 1234567890 IN IP4 192.168.1.100
s=IPCamera Stream
c=IN IP4 0.0.0.0
t=0 0
a=control:*
m=video 0 RTP/AVP 96
a=control:trackID=0
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=42801F;sprop-parameter-sets=Z0LAH9oBQBboQAAA,aM48gA==
m=audio 0 RTP/AVP 97
a=control:trackID=1
a=rtpmap:97 MPEG4-GENERIC/48000/2
a=fmtp:97 streamtype=5;profile-level-id=1;mode=AAC-hbr;config=1190;SizeLength=13;IndexLength=3;IndexDeltaLength=3

DESCRIBE 的价值:

SDP 告诉客户端什么 客户端拿它做什么
有几路媒体 创建 video/audio track。
每路媒体的 track URL 对 trackID=0/1 分别发送 SETUP。
Payload Type 到 codec 的映射 收到 RTP 包后用 PT 判断是 H.264 还是 AAC。
H.264 时钟频率 RTP timestamp 用 90000 时基换算播放时间。
AAC 采样率和声道数 初始化音频解码器。
SPS/PPS 或 AAC config 提前初始化解码器,不必等码流内参数集。

4.4 SETUP:建立媒体通道

UDP 模式下,客户端在 SETUP 里告诉服务端"我准备好在哪两个 UDP 端口收 RTP/RTCP"。

视频 track 请求示例:

http 复制代码
SETUP rtsp://192.168.1.100/stream/trackID=0 RTSP/1.0
CSeq: 3
Transport: RTP/AVP;unicast;client_port=8000-8001

视频 track 响应示例:

http 复制代码
RTSP/1.0 200 OK
CSeq: 3
Session: 12345678;timeout=60
Transport: RTP/AVP;unicast;client_port=8000-8001;server_port=6000-6001;ssrc=0A12B3C4

SETUP 协商结果:

字段 示例 含义
Transport RTP/AVP;unicast RTP Audio/Video Profile,单播模式。
client_port 8000-8001 客户端收 RTP/RTCP 的 UDP 端口,通常偶数 RTP、奇数 RTCP。
server_port 6000-6001 服务端发送 RTP/RTCP 使用的 UDP 端口。
Session 12345678;timeout=60 RTSP 会话 ID,后续 PLAY/PAUSE/TEARDOWN 必须带。
ssrc 0A12B3C4 RTP 同步源标识,部分服务端会返回。

如果 SDP 有音频 track,还要对音频再 SETUP:

track SETUP URL 端口示例 说明
视频 /stream/trackID=0 client_port=8000-8001 收视频 RTP/RTCP。
音频 /stream/trackID=1 client_port=8002-8003 收音频 RTP/RTCP。

TCP interleaved 模式的 SETUP 不使用 UDP 端口:

http 复制代码
SETUP rtsp://192.168.1.100/stream/trackID=0 RTSP/1.0
CSeq: 3
Transport: RTP/AVP/TCP;unicast;interleaved=0-1
模式 Transport 示例 媒体怎么走
UDP RTP/AVP;unicast;client_port=8000-8001 RTP/RTCP 走独立 UDP 端口。
TCP interleaved RTP/AVP/TCP;unicast;interleaved=0-1 RTP/RTCP 用 $ 帧复用在 RTSP TCP 连接里。

4.5 PLAY:开始发送 RTP

请求示例:

http 复制代码
PLAY rtsp://192.168.1.100/stream RTSP/1.0
CSeq: 5
Session: 12345678
Range: npt=0.000-

响应示例:

http 复制代码
RTSP/1.0 200 OK
CSeq: 5
Session: 12345678
Range: npt=0.000-
RTP-Info: url=rtsp://192.168.1.100/stream/trackID=0;seq=12345;rtptime=98765,url=rtsp://192.168.1.100/stream/trackID=1;seq=32100;rtptime=45678

PLAY 之后发生什么:

内容 说明
服务端开始发 RTP UDP 模式发到 client_port;TCP 模式发 $ interleaved frame。
Range npt=0.000- 表示从头或 live 起点开始;点播 seek 也靠它。
RTP-Info.seq 该 track 第一个 RTP 包的 sequence number。
RTP-Info.rtptime 该 track 第一个 RTP 包的 RTP timestamp。
播放器初始化同步 用 RTP-Info、RTP timestamp、RTCP SR 等信息做音视频同步。

4.6 PAUSE / TEARDOWN:暂停和结束

方法 典型请求 服务端行为 使用场景
PAUSE 带 Session 暂停发送 RTP,但保留会话资源。 点播暂停、部分摄像头不支持。
PLAY after PAUSE 带 Session 和可选 Range 恢复发送 RTP。 点播恢复播放。
TEARDOWN 带 Session 释放会话、端口、缓存。 停止播放、退出页面。
GET_PARAMETER 带 Session 可作为保活。 摄像头/NVR 长连接保活。

5. 控制方法

方法 方向 是否常见 作用 常见 Header
OPTIONS C → S 高 查询服务端支持的方法。 CSeq。
DESCRIBE C → S 高 获取 SDP。 Accept: application/sdp。
SETUP C → S 高 建立 RTP/RTCP 传输通道。 Transport、Session。
PLAY C → S 高 开始或恢复播放。 Session、Range。
PAUSE C → S 中 暂停播放。 Session。
TEARDOWN C → S 高 结束并释放资源。 Session。
GET_PARAMETER C ↔ S 中 查询参数或保活。 Session。
SET_PARAMETER C → S 低到中 设置参数,厂商私有较多。 Content-Type、body。
ANNOUNCE C → S 低 客户端向服务端提交 SDP,多见推送/录制场景。 SDP body。
RECORD C → S 低 录制或推流相关。 Session。
REDIRECT S → C 低 服务端要求客户端切到其他 URL。 Location。

6. 媒体传输三种模式

6.1 RTP over UDP:默认低延迟模式

通道 典型协议 / 端口 作用 优点 风险
RTSP 控制 TCP 554 发送 OPTIONS/DESCRIBE/SETUP/PLAY。 可靠、有序。 只管控制,不传大媒体。
RTP 视频 UDP 偶数端口,例如 8000 承载视频 RTP 包。 延迟低。 NAT/防火墙/丢包。
RTCP 视频 UDP 奇数端口,例如 8001 承载统计和同步反馈。 可做质量反馈。 有些设备实现不完整。
RTP 音频 UDP 偶数端口,例如 8002 承载音频 RTP 包。 和视频分离。 需要音视频同步。
RTCP 音频 UDP 奇数端口,例如 8003 音频反馈。 同步和统计。 可能被防火墙拦截。

6.2 RTP over TCP interleaved:跨防火墙友好

TCP interleaved 把 RTP/RTCP 包塞回 RTSP 的 TCP 连接,用 $ 前缀区分二进制媒体包和普通 RTSP 文本响应。

项 说明
SETUP 写法 Transport: RTP/AVP/TCP;unicast;interleaved=0-1。
通道号 0 常表示 RTP,1 常表示 RTCP;音频可能用 2-3。
包格式 $ + channel(1 byte) + length(2 bytes) + RTP/RTCP payload。
优势 只需要一条 TCP 连接,穿 NAT/防火墙更稳。
劣势 TCP 丢包重传会队头阻塞,弱网下延迟可能变大。
FFmpeg 参数 -rtsp_transport tcp。

6.3 RTP over HTTP / HTTPS tunneling

特性 说明
目标 穿过更严格的 HTTP 代理或防火墙。
实现 用 HTTP/HTTPS 隧道包装 RTSP/RTP。
现实情况 标准和设备支持差异大,工程上远不如 UDP/TCP interleaved 常见。
替代方案 公网播放通常转 HLS/HTTP-FLV/WebRTC。

三种模式选型:

场景 推荐模式 原因
局域网监控 RTP over UDP 延迟低,网络环境可控。
跨网段 / 防火墙复杂 RTP over TCP interleaved 端口少,成功率高。
公网互联网播放 转 HLS/HTTP-FLV/WebRTC 浏览器和 CDN 生态更适合。
弱网但要求低延迟 视情况 UDP 或 WebRTC/SRT TCP 重传可能导致延迟积累。

7. SDP 详解

SDP 是 DESCRIBE 响应体里的媒体说明书。RTSP 客户端拿到 SDP 后,才知道要对哪些 track 发 SETUP,以及 RTP 包里的 payload type 应该怎么解释。

7.1 一份典型 IPC SDP

sdp 复制代码
v=0
o=- 1234567890 1234567890 IN IP4 192.168.1.100
s=IPCamera Stream
c=IN IP4 0.0.0.0
t=0 0
a=control:*
a=range:npt=0-
m=video 0 RTP/AVP 96
a=control:trackID=0
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=42801F;sprop-parameter-sets=Z0LAH9oBQBboQAAA,aM48gA==
m=audio 0 RTP/AVP 97
a=control:trackID=1
a=rtpmap:97 MPEG4-GENERIC/48000/2
a=fmtp:97 streamtype=5;profile-level-id=1;mode=AAC-hbr;config=1190;SizeLength=13;IndexLength=3;IndexDeltaLength=3

7.2 会话级字段

行 字段名 示例 含义 客户端怎么用
v= Version v=0 SDP 协议版本,通常固定 0。 基础解析校验。
o= Origin o=- 1234567890 1234567890 IN IP4 192.168.1.100 会话创建者、session id、版本、网络类型、地址。 一般用于标识会话,不直接决定播放。
s= Session Name s=IPCamera Stream 会话名称。 展示或日志。
c= Connection Info c=IN IP4 0.0.0.0 连接地址。RTSP 场景经常不靠它决定端口。 真实端口通常由 SETUP 协商。
t= Timing t=0 0 会话有效时间,0 0 常表示永久。 直播/监控常见永久。
a=control:* Session Control a=control:* 会话级控制 URL。 PLAY/TEARDOWN 可对聚合 URL 操作。
a=range Range a=range:npt=0- 可播放时间范围。 点播 seek 或 live 范围判断。

7.3 媒体级字段:m= 和 a=control

行 示例 含义 关键点
m=video 0 RTP/AVP 96 video track 媒体类型是视频;端口写 0;RTP profile 是 RTP/AVP;payload type 是 96。 RTSP 里端口常写 0,因为端口靠 SETUP 协商。
m=audio 0 RTP/AVP 97 audio track 媒体类型是音频;payload type 是 97。 动态 payload type 要靠 rtpmap 解释。
a=control:trackID=0 video 控制 URL 这路 video track 的相对控制地址。 客户端用它拼出 SETUP rtsp://.../trackID=0。
a=control:trackID=1 audio 控制 URL 这路 audio track 的相对控制地址。 每路媒体通常都要 SETUP。

a=control URL 拼接规则:

SDP 写法 示例 SETUP URL 怎么理解
相对路径 a=control:trackID=0 基于 Content-Base 或 DESCRIBE URL 拼接。
绝对 RTSP URL a=control:rtsp://host/stream/trackID=0 直接使用该 URL。
星号 a=control:* 会话级控制,不代表某一路媒体 track。
厂商私有 a=control:streamid=0 按服务端返回原样 SETUP,不要猜。

7.4 Payload Type:静态和动态

Payload Type 范围 含义 例子 说明
0-95 静态或历史保留较多。 0=PCMU、8=PCMA、14=MPA。 客户端可按标准表解释。
96-127 动态 payload type。 96=H264、97=AAC 常见。 必须看 SDP 的 a=rtpmap 和 a=fmtp。

动态 PT 的映射示例:

RTP 包里的 PT SDP 行 解释
96 a=rtpmap:96 H264/90000 PT=96 的 RTP payload 是 H.264,RTP 时钟 90kHz。
97 a=rtpmap:97 MPEG4-GENERIC/48000/2 PT=97 的 RTP payload 是 AAC,采样率 48kHz,2 声道。

7.5 H.264 的 SDP 参数

H.264 通常由 a=rtpmap 和 a=fmtp 两类行描述:

字段 示例 说明
a=rtpmap a=rtpmap:96 H264/90000 H.264 RTP timestamp 使用 90kHz 时钟。
packetization-mode 1 0 表示单 NAL 模式;1 支持非交错模式,常见 FU-A 分片。
profile-level-id 42801F H.264 profile/constraint/level,播放器可用于兼容性判断。
sprop-parameter-sets Z0LA...,aM48... Base64 编码的 SPS/PPS,通常用逗号分隔。

sprop-parameter-sets 的作用:

作用 说明
提前初始化解码器 客户端不必等 RTP 里出现 SPS/PPS,就能配置 H.264 decoder。
确定分辨率等参数 SPS 里包含 profile、level、宽高、VUI 等信息。
降低首帧等待 摄像头如果不是每个 IDR 都带 SPS/PPS,SDP 里的参数集很关键。
调试黑屏重点 SDP 没有 SPS/PPS、SPS/PPS 错或 base64 解析失败,都可能导致黑屏。

H.264 over RTP 常见 payload 形态:

形态 说明 什么时候出现
Single NAL Unit 一个 RTP 包放一个完整 NAL。 小 NAL,例如 SPS/PPS/小 P 帧。
STAP-A 一个 RTP 包聚合多个小 NAL。 把 SPS/PPS 等小包合并发送。
FU-A 一个大 NAL 被拆成多个 RTP 包。 大 I 帧 / 大 P 帧超过 MTU 时。

7.6 AAC 的 SDP 参数

AAC over RTP 在 RTSP 监控里常见 MPEG4-GENERIC:

字段 示例 说明
a=rtpmap a=rtpmap:97 MPEG4-GENERIC/48000/2 PT=97 是 MPEG4-GENERIC,采样率 48kHz,2 声道。
mode AAC-hbr AAC high bit-rate 模式。
config 1190 AudioSpecificConfig 十六进制表示,描述 AAC profile、采样率、声道。
SizeLength 13 AU header 中 size 字段位数。
IndexLength 3 AU header 中 index 字段位数。
IndexDeltaLength 3 AU header 中 index delta 字段位数。

AAC 易错点:

坑点 正确理解
以为 RTP payload 一定是 ADTS 标准 MPEG4-GENERIC 常是 AU Header + AAC raw access unit,不是简单 ADTS 文件帧。
忽略 config config 是初始化 AAC 解码器的重要信息,类似 MP4 里的 AudioSpecificConfig。
只看 payload type PT=97 只是动态编号,真正 codec 必须看 rtpmap/fmtp。

7.7 客户端拿到 SDP 后做什么

顺序 客户端动作 依赖 SDP 内容
1 解析 session 级字段。 v/o/s/c/t/a=control。
2 枚举 m= 媒体段。 判断有 video、audio、subtitle 几路 track。
3 建立 PT → codec 映射。 a=rtpmap、a=fmtp。
4 拼出每路 SETUP URL。 a=control + Content-Base。
5 初始化解码器参数。 H.264 SPS/PPS、AAC config。
6 为每路媒体 SETUP 端口。 video/audio track 各自 setup。
7 PLAY 后解析 RTP。 RTP header 的 PT、timestamp、seq。

8. RTP 包格式(媒体数据)

RTP 包一般由固定 12 字节 header + 可选扩展 + payload 组成。

8.1 RTP Header 字段

字段 位数 示例 / 范围 作用
V 2 2 RTP 版本,通常为 2。
P 1 0/1 Padding 标记。
X 1 0/1 Header extension 标记。
CC 4 0-15 CSRC 个数。
M 1 H.264 常用于帧结束 Marker bit;视频常标记一帧最后一个 RTP 包。
PT 7 96、97 Payload Type;动态 PT 必须结合 SDP 解释。
Sequence Number 16 递增 检测丢包、乱序、重排。
Timestamp 32 H.264 90kHz 时基 表示媒体采样时间,不是系统绝对时间。
SSRC 32 随机源标识 同步源 ID,区分不同 RTP source。
CSRC 0-15 个,每个 32 位 混音/混流场景 监控拉流中通常没有。

RTP header 和 SDP 的关系:

RTP 字段 需要 SDP 帮忙解释吗 例子
PT 需要,尤其是 96-127 动态 PT。 SDP 告诉 96=H264、97=AAC。
Timestamp 需要知道 codec clock rate。 H.264 90000,AAC 48000。
Payload 需要 codec 和 packetization 参数。 H.264 FU-A、AAC MPEG4-GENERIC。

8.2 H.264 over RTP

Payload 形态 RTP payload 第一个字节特征 作用 客户端处理
Single NAL NAL type 为普通类型,例如 1/5/7/8。 一个 RTP 包就是一个完整 NAL。 直接恢复 NAL,必要时加 Annex-B start code。
STAP-A NAL type 24。 一个 RTP 包聚合多个小 NAL。 逐个拆出内部 NAL。
FU-A NAL type 28。 大 NAL 分片。 按 Start/End 标记重组完整 NAL。

FU-A 关键字段:

字段 说明
FU Indicator 包含原始 NAL 的 F/NRI 和 type=28。
FU Header S Start bit,表示这是分片开始。
FU Header E End bit,表示这是分片结束。
FU Header Type 原始 NAL type,例如 5 表示 IDR。
Marker bit 通常一帧最后一个 RTP 包置 1,帮助帧边界判断。

8.3 AAC over RTP

项 说明
常见 SDP MPEG4-GENERIC/48000/2 + mode=AAC-hbr。
payload 结构 通常是 AU Headers Length + AU Headers + AAC raw data。
不是简单 ADTS 很多 RTSP AAC RTP 不带 ADTS header,不能直接当 .aac 文件拼。
解码初始化 依赖 SDP config 生成 AudioSpecificConfig。
时间戳步进 AAC-LC 每帧常见 1024 samples;48kHz 下 timestamp 每帧常加 1024。

8.4 RTP、RTCP、音视频同步

机制 作用
RTP Sequence 检测丢包、乱序、重复包。
RTP Timestamp 单 track 内恢复播放时间。
RTCP Sender Report 把 RTP timestamp 和 NTP 时间关联,用于跨 track 音视频同步。
RTP-Info PLAY 响应里给初始 seq/rtptime,帮助起播时建立映射。
Jitter Buffer 客户端缓存少量 RTP 包,抵抗乱序和抖动。

详见下一篇 RTP 专题时,可以再深入 H.264 FU-A、STAP-A、RTCP SR/RR、jitter buffer。


9. 鉴权

RTSP 鉴权通常在客户端第一次请求时触发:服务端返回 401 Unauthorized 和 WWW-Authenticate,客户端再带 Authorization 重试。

9.1 Basic Auth

Basic challenge:

http 复制代码
RTSP/1.0 401 Unauthorized
CSeq: 1
WWW-Authenticate: Basic realm="IPCamera"

客户端重试:

http 复制代码
OPTIONS rtsp://192.168.1.100/stream RTSP/1.0
CSeq: 2
Authorization: Basic YWRtaW46MTIzNDU=

Basic Auth 解释:

项 说明
编码内容 base64(username:password),例如 admin:12345。
安全性 Base64 只是编码,不是加密;抓包后很容易还原。
适用性 局域网老设备可能支持,但不建议公网使用。
改进方式 至少使用 RTSPS/VPN/专网,避免明文暴露。

9.2 Digest Auth(摄像头主流)

Digest challenge:

http 复制代码
RTSP/1.0 401 Unauthorized
CSeq: 1
WWW-Authenticate: Digest realm="IPCamera", nonce="abc123", algorithm=MD5, qop="auth"

客户端重试:

http 复制代码
DESCRIBE rtsp://192.168.1.100/stream RTSP/1.0
CSeq: 2
Accept: application/sdp
Authorization: Digest username="admin", realm="IPCamera", nonce="abc123", uri="rtsp://192.168.1.100/stream", response="b8e9d1234...", algorithm=MD5

Digest 关键字段:

字段 来源 作用
realm 服务端 认证域,参与 hash。
nonce 服务端 一次性随机值,防止简单重放。
username 客户端 用户名。
uri 客户端 本次请求 URI,参与 hash。
response 客户端计算 证明客户端知道密码,但不直接发送密码。
qop / cnonce / nc 可选增强 增强防重放能力,设备支持情况不一。

Digest 简化计算:

步骤 计算
HA1 MD5(username:realm:password)。
HA2 MD5(method:uri)。
response 无 qop 时常见为 MD5(HA1:nonce:HA2);有 qop 时还会加入 nc/cnonce/qop。

Digest 的安全边界:

结论 说明
比 Basic 好 密码不会直接以 base64 形式发送。
不是加密传输 RTSP 请求、SDP、RTP 仍可能被嗅探。
MD5 已老旧 很多摄像头仍只支持 MD5 Digest。
公网仍需额外保护 推荐 VPN、专网、TLS、零信任网关或协议转换。

9.3 RTSPS

特性 说明
协议 RTSP over TLS。
作用 加密 RTSP 控制连接,避免 Header、鉴权信息被明文嗅探。
端口 设备实现不统一,可能是 322、443、554 上升级或私有端口。
限制 摄像头支持率不如 HTTPS/HLS 普遍,部署证书也更复杂。
注意 如果 RTP 仍走独立 UDP,媒体是否加密还要看具体实现;仅控制面 TLS 不一定等于媒体加密。

10. 实战(FFmpeg)

10.1 拉流播放

bash 复制代码
ffplay rtsp://admin:12345@192.168.1.100/stream

常用参数:

参数 作用 什么时候用
-rtsp_transport tcp 强制 RTP over TCP interleaved。 UDP 被防火墙拦截、花屏、丢包时。
-stimeout / -timeout 设置连接或读超时。 摄像头不响应、网络不稳定时。
-fflags nobuffer 减少 demux 缓冲。 低延迟预览。
-flags low_delay 解码低延迟倾向。 低延迟预览。

10.2 拉流转封装

场景 命令 / 写法 说明
RTSP → MP4 文件 ffmpeg -rtsp_transport tcp -i rtsp://admin:12345@192.168.1.100/stream -c copy output.mp4 不转码,直接把 RTP 中的 H.264/AAC 重新封装进 MP4。
RTSP → RTMP 推流 ffmpeg -rtsp_transport tcp -i rtsp://192.168.1.100/stream -c copy -f flv rtmp://server/app/key 摄像头拉流后推到直播 CDN。
RTSP → HLS ffmpeg -rtsp_transport tcp -i rtsp://192.168.1.100/stream -c copy -f hls -hls_time 2 output.m3u8 把摄像头流转成浏览器/移动端更好播放的 HLS。

10.3 用 OPTIONS 探活

bash 复制代码
ffprobe -v debug -rtsp_transport tcp rtsp://192.168.1.100/stream
看什么 说明
OPTIONS 响应 服务端是否在线,支持哪些方法。
DESCRIBE 响应 SDP 是否返回,codec 是否符合预期。
SETUP Transport 实际走 UDP 还是 TCP,端口是否协商成功。
RTP 日志 是否持续收到 packet,是否丢包。

11. 用 GStreamer

bash 复制代码
gst-launch-1.0 -v rtspsrc location=rtsp://192.168.1.100/stream \
  protocols=tcp ! decodebin ! autovideosink
组件 作用
rtspsrc 实现 RTSP 客户端,会自动 OPTIONS/DESCRIBE/SETUP/PLAY。
protocols=tcp 要求 RTP over TCP interleaved。
decodebin 自动选择 depay、parse、decoder。
autovideosink 自动选择视频显示 sink。

12. 服务端

12.1 GStreamer RTSP Server

c 复制代码
#include <gst/rtsp-server/rtsp-server.h>

GstRTSPServer *server = gst_rtsp_server_new();
GstRTSPMountPoints *mounts = gst_rtsp_server_get_mount_points(server);
GstRTSPMediaFactory *factory = gst_rtsp_media_factory_new();

gst_rtsp_media_factory_set_launch(factory,
    "videotestsrc ! x264enc ! rtph264pay name=pay0 pt=96");
gst_rtsp_mount_points_add_factory(mounts, "/test", factory);
gst_rtsp_server_attach(server, NULL);

// rtsp://localhost:8554/test

12.2 商业 / 开源选项

项目 语言 / 类型 特点
GStreamer RTSP Server C 和 GStreamer pipeline 集成方便。
Live555 C++ 经典 RTSP/RTP 库,很多项目参考。
ZLMediaKit C++ 国内常用,多协议转换能力强。
EasyDarwin Go/C++ 生态项目 国内 RTSP/流媒体方向历史项目。
Wowza / Flussonic 商业 商业流媒体服务端。
SRS C++ 主要强项在 RTMP/WebRTC/SRT/HLS 等,RTSP 支持需看具体版本能力。

13. 常见坑

13.1 拉不到流

现象 可能原因 排查动作
Connection refused 端口没开、服务没启动、IP 错。 telnet host 554、确认摄像头 RTSP 开关。
404 Not Found RTSP path 错。 对照厂商文档,区分主码流/子码流 URL。
401 Unauthorized 用户名密码错,或 Digest 没处理。 看 WWW-Authenticate,确认客户端支持 Digest。
DESCRIBE 无响应 防火墙、设备固件兼容问题。 用 VLC/FFmpeg 对比,打开 debug 日志。
SETUP 失败 UDP 端口被拦,NAT 不通。 试 -rtsp_transport tcp。

13.2 卡顿 / 花屏

现象 可能原因 处理方式
花屏 UDP 丢包导致 H.264 NAL 缺片。 切 TCP interleaved;改善网络;降低码率。
卡顿 带宽不够或 jitter 大。 拉子码流;增大 jitter buffer;就近部署网关。
黑屏但有连接 SDP 缺 SPS/PPS、payload type 映射错、解码器不支持。 检查 SDP fmtp,抓 RTP 看 IDR/SPS/PPS。
有视频无音频 audio track 没 SETUP,AAC config 解析失败。 检查 SDP audio rtpmap/fmtp 和第二次 SETUP。
延迟越来越大 TCP 重传、播放器 buffer 增长、服务端堆积。 降低码率、低延迟参数、监控网络丢包。

13.3 鉴权失败 401

原因 说明 处理
账号密码错误 摄像头 Web 登录和 RTSP 用户可能不同。 确认 RTSP 用户权限。
Digest 算法不兼容 设备可能要求 Digest,但客户端只发 Basic。 换支持 Digest 的客户端或升级库。
URI 参与 hash 不一致 Digest response 对 URI 敏感。 确认 Authorization 里的 uri 和请求 URI 一致。
nonce 过期 服务端 nonce 过期或重放。 重新请求拿新 nonce。

13.4 RTCP timeout

原因 说明 处理
服务端不发 RTCP 一些 IPC 实现不完整。 客户端放宽 RTCP 超时策略。
RTCP 端口被拦 UDP 奇数端口不通。 切 TCP interleaved。
NAT 映射失效 长时间无包导致端口映射失效。 保活、TCP、网关代理。

14. RTSP vs ONVIF

RTSP 和 ONVIF 经常一起出现,但它们不是一类东西。

维度 RTSP ONVIF
定位 流媒体控制协议。 设备管理和互联标准。
主要解决 怎么拉一条音视频流。 怎么发现设备、管理配置、控制 PTZ、订阅事件、拿流地址。
承载协议 RTSP 文本 + RTP/RTCP。 SOAP/HTTP、WS-Discovery、WS-Security 等。
媒体数据 通过 RTP 传 H.264/H.265/AAC 等。 自己不直接传媒体,通常返回 RTSP URL。
典型接口 DESCRIBE/SETUP/PLAY。 GetProfiles、GetStreamUri、ContinuousMove、GetEvents。
使用方 播放器、NVR、流媒体网关。 设备管理平台、NVR、配置工具。

ONVIF 常见能力:

能力 说明 和 RTSP 的关系
设备发现 在局域网发现摄像头。 找到设备后再拿 RTSP 地址。
获取媒体配置 查询 profile、编码参数、分辨率、码率。 用 GetStreamUri 获取 RTSP URL。
PTZ 控制 云台平移、倾斜、变焦。 控制摄像头姿态,媒体仍可通过 RTSP 看结果。
事件订阅 移动侦测、遮挡、告警。 事件走 ONVIF,视频流走 RTSP/RTP。
用户/网络配置 时间、网络、用户、安全配置。 属于设备管理,不属于 RTSP。

典型监控平台接入流程:

步骤 协议 动作
1 ONVIF WS-Discovery 发现局域网摄像头。
2 ONVIF Device/Media 登录并查询 profiles。
3 ONVIF Media 调 GetStreamUri 获取 RTSP URL。
4 RTSP OPTIONS/DESCRIBE/SETUP/PLAY 拉流。
5 RTP/RTCP 持续接收音视频。
6 ONVIF PTZ/Event 需要时控制云台或接收告警。

结论 :RTSP 是"看视频"的链路,ONVIF 是"管设备"的链路;监控行业通常是 ONVIF 找设备和拿地址,RTSP/RTP 真正拉媒体。


15. 总结

RTSP 可以按分层记忆:

层级 关键内容 一句话
控制层 RTSP over TCP 554 用文本请求/响应控制播放会话。
描述层 SDP 描述 track、codec、payload type、SPS/PPS、AAC config。
传输协商层 SETUP + Transport 协商 UDP 端口或 TCP interleaved 通道。
媒体层 RTP 真正承载 H.264/H.265/AAC 等媒体数据。
反馈层 RTCP 丢包、抖动、同步、统计。
设备管理层 ONVIF 发现设备、拿 RTSP URL、PTZ、事件、配置。

完整拉流主线:

顺序 动作 记忆点
1 OPTIONS 先问服务端支持哪些方法。
2 DESCRIBE 拿 SDP,知道有哪些 track 和 codec。
3 SETUP video 给视频协商 RTP/RTCP 端口或 interleaved 通道。
4 SETUP audio 有音频时再给音频协商通道。
5 PLAY 服务端开始发送 RTP 包。
6 RTP/RTCP 客户端重组 H.264/AAC,做同步和解码。
7 GET_PARAMETER / OPTIONS 可选保活。
8 TEARDOWN 结束会话,释放资源。

和其他协议的取舍:

目标 更常用方案 原因
拉 IPC/NVR 监控流 RTSP 摄像头原生支持,生态最成熟。
主播推流到 CDN RTMP / SRT / WebRTC 推流生态和公网传输更成熟。
互联网大规模播放 HLS / DASH / HTTP-FLV HTTP/CDN 友好,浏览器和 App 支持好。
互动低延迟 WebRTC 端到端低延迟、拥塞控制和 NAT 穿透更完整。
设备发现和云台控制 ONVIF 管设备,不直接替代 RTSP 拉流。

金句:RTSP 是监控行业的"播放控制面",SDP 是"媒体说明书",RTP 是"真正的视频包",ONVIF 是"设备管理面"。把这四个角色分清,RTSP 拉流链路就不会乱。

相关推荐
刘马想放假1 小时前
CANviz 使用指南|Linux 安装、DBC 解码、实时曲线与 J1939 实战
linux·python·websocket
疯华整猫2 小时前
删掉 LeakCanary 那天,我用 Trae 自己撸了一套:最难的不是分析堆,是决定什么时候 dump
android·人工智能·性能优化
kloc2 小时前
聊天室项目入口网关子服务的实现
linux·c++
GeW2 小时前
深圳APEC峰会倒计时:数据库与Linux运维的"隐形考场"
linux
梦到啥说啥4 小时前
Linux网络编程:UDP网络协议
linux·网络协议·udp
乐橙开放平台5 小时前
海康和大华摄像头能统一管理吗?可以通过 GB28181 或视频融合平台接入
网络·后端·物联网·音视频
无足鸟ICT5 小时前
【RHCA+】ipcrm命令(删除IPC资源)
linux
星恒随风6 小时前
MySQL 从零入门(四):表的增删改查与基础查询详解
linux·服务器·数据库·笔记·mysql
陈希1239 小时前
Linux 网络诊断工具实战:ping、curl、tcpdump、mtr、dig 用法详解
linux·网络·tcpdump