协议之RTSP介绍

RTSP(Real-Time Streaming Protocol)是一种用于控制流媒体服务器的应用层协议,工作在 TCP/IP 之上,默认端口 554 (RTSP)或 322(RTSPS)。

一,协议格式

1.1 RTSP 请求格式

复制代码
┌─────────────────────────────────────────────────────────────────┐
│                      RTSP 请求格式                              │
├─────────────────────────────────────────────────────────────────┤
│  ┌──────────────────────────────────────────────────────────┐  │
│  │ 请求行 (Request Line)                                    │  │
│  │ ┌─────────┬───────────────────────┬──────────────────┐  │  │
│  │ │ METHOD  │          URL          │    PROTOCOL      │  │  │
│  │ │ (命令)  │   (资源路径)           │  (RTSP/1.0)     │  │  │
│  │ └─────────┴───────────────────────┴──────────────────┘  │  │
│  │   示例:  PLAY rtsp://server:554/stream RTSP/1.0         │  │
│  └──────────────────────────────────────────────────────────┘  │
│                              ↓                                 │
│  ┌──────────────────────────────────────────────────────────┐  │
│  │ 头部字段 (Headers)                                       │  │
│  │ ┌────────────────────────────────────────────────────┐   │  │
│  │ │ CSeq: 3                                          │   │  │  ← 必需,序列号
│  │ │ Session: 1234567890                               │   │  │  ← 会话标识
│  │ │ Transport: RTP/AVP/UDP;client_port=1234-1235      │   │  │  ← 传输参数
│  │ │ Range: npt=0.0-                                   │   │  │  ← 时间范围
│  │ │ Scale: 1.0                                        │   │  │  ← 播放速度
│  │ │ Authorization: Basic YWRtaW46cGFzc3dvcmQ=         │   │  │  ← 认证信息
│  │ │ Content-Type: application/sdp                     │   │  │  ← 内容类型
│  │ │ Content-Length: 1234                             │   │  │  ← 内容长度
│  │ └────────────────────────────────────────────────────┘   │  │
│  └──────────────────────────────────────────────────────────┘  │
│                              ↓                                 │
│  ┌──────────────────────────────────────────────────────────┐  │
│  │ 空行 (CRLF)                                             │  │  ← 必需,分隔头部和体
│  └──────────────────────────────────────────────────────────┘  │
│                              ↓                                 │
│  ┌──────────────────────────────────────────────────────────┐  │
│  │ 消息体 (Body) [可选]                                    │  │
│  │   (如 DESCRIBE 响应中的 SDP 描述、SET_PARAMETER 的参数)   │  │
│  └──────────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────┘

1.2 RTSP 响应格式

复制代码
┌─────────────────────────────────────────────────────────────────┐
│                      RTSP 响应格式                              │
├─────────────────────────────────────────────────────────────────┤
│  ┌──────────────────────────────────────────────────────────┐  │
│  │ 状态行 (Status Line)                                     │  │
│  │ ┌───────────┬────────────┬───────────────────────────┐   │  │
│  │ │ PROTOCOL  │ STATUS CODE │        REASON PHRASE     │   │  │
│  │ │ RTSP/1.0  │    200      │         OK               │   │  │
│  │ └───────────┴────────────┴───────────────────────────┘   │  │
│  │   示例:  RTSP/1.0 200 OK                                │  │
│  └──────────────────────────────────────────────────────────┘  │
│                              ↓                                 │
│  ┌──────────────────────────────────────────────────────────┐  │
│  │ 头部字段 (Headers)                                       │  │
│  │ ┌────────────────────────────────────────────────────┐   │  │
│  │ │ CSeq: 3                                          │   │  │  ← 对应请求的序列号
│  │ │ Session: 1234567890;timeout=60                   │   │  │  ← 会话ID和超时
│  │ │ Date: Wed, 04 Jul 2026 12:00:00 GMT              │   │  │  ← 服务器时间
│  │ │ Content-Type: application/sdp                     │   │  │  ← 内容类型
│  │ │ Content-Length: 512                              │   │  │  ← 内容长度
│  │ │ Transport: RTP/AVP/UDP;client_port=1234-1235;    │   │  │  ← 协商后的传输参数
│  │ │            server_port=5000-5001;ssrc=0x12345678 │   │  │
│  │ └────────────────────────────────────────────────────┘   │  │
│  └──────────────────────────────────────────────────────────┘  │
│                              ↓                                 │
│  ┌──────────────────────────────────────────────────────────┐  │
│  │ 空行 (CRLF)                                             │  │  ← 必需
│  └──────────────────────────────────────────────────────────┘  │
│                              ↓                                 │
│  ┌──────────────────────────────────────────────────────────┐  │
│  │ 消息体 (Body) [可选]                                    │  │
│  │   (如 DESCRIBE 响应中的 SDP)                              │  │
│  └──────────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────┘

1.2 RTSP协议交互

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    RTSP 会话流程                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Client                  Server                              │
│    │                        │                               │
│    │─── OPTIONS ───────────→│                               │
│    │←── 200 OK ─────────────│  获取支持的命令列表            │
│    │                        │                               │
│    │─── DESCRIBE ──────────→│                               │
│    │←── 200 OK (SDP) ──────│  获取媒体描述                 │
│    │                        │                               │
│    │─── SETUP (track1) ────→│                               │
│    │←── 200 OK (Session)───│  建立RTP通道                  │
│    │                        │                               │
│    │─── SETUP (track2) ────→│  (如有多个媒体轨道)           │
│    │←── 200 OK ─────────────│                               │
│    │                        │                               │
│    │─── PLAY ──────────────→│                               │
│    │←── 200 OK ─────────────│  开始流媒体传输              │
│    │                        │                               │
│    │←── RTP/RTCP ───────────│  数据传输                    │
│    │                        │                               │
│    │─── TEARDOWN ──────────→│                               │
│    │←── 200 OK ─────────────│  终止会话                    │
│                                                             │
└─────────────────────────────────────────────────────────────┘
命令 用途 客户端方法
OPTIONS 查询服务器支持的命令 sendOptionsCommand()
DESCRIBE 获取媒体会话描述(SDP) sendDescribeCommand()
SETUP 建立媒体流传输通道 sendSetupCommand()
PLAY 开始播放 sendPlayCommand()
PAUSE 暂停播放 sendPauseCommand()
TEARDOWN 终止会话 sendTeardownCommand()
GET_PARAMETER 获取会话参数 sendGetParameterCommand()
SET_PARAMETER 设置会话参数 sendSetParameterCommand()

二、RTSP交互信息

2.1 RTSP状态码

状态码 含义 说明
200 OK 请求成功
400 Bad Request 请求格式错误
401 Unauthorized 需要认证
404 Not Found 资源不存在
405 Method Not Allowed 不支持的方法
451 Parameter Not Understood 参数无法理解
500 Internal Server Error 服务器内部错误
501 Not Implemented 功能未实现

2.2 RTSP字段介绍

头部字段 作用 是否必需
CSeq 请求序列号,用于请求-响应配对 必需
Session 会话标识符,用于关联多个请求 SETUP后必需
Transport 传输参数(协议、端口等) SETUP必需
Range 播放时间范围 PLAY可选
Scale 播放速度(1.0为正常) PLAY可选
Authorization 认证凭证 认证时必需
Content-Type 消息体类型 有消息体时必需
Content-Length 消息体长度 有消息体时必需

2.3 RTSP URL协议结构

复制代码
rtsp[s]://[username[:password]@]host[:port]/path
       ↓        ↓              ↓    ↓      ↓
   协议类型   认证信息        主机 端口   资源路径
   (554/322)                           
   
示例:
rtsp://admin:password@192.168.1.1:554/cam/realmonitor?channel=1
rtsps://secure.example.com:322/live/stream1

2.3.1 RTSP客户端构建流程

cpp 复制代码
char const* const cmdFmt =
    "%s %s %s\r\n"              // METHOD URL PROTOCOL
    "CSeq: %d\r\n"              // 序列号(必需)
    "%s"                        // 认证信息
    "%s"                        // User-Agent
    "%s"                        // Require
    "%s"                        // 额外头部(Transport/Session等)
    "%s"                        // Content-Length
    "\r\n"
    "%s";                       // 请求体

// 示例:SETUP 请求
// SETUP rtsp://server:554/stream/track1 RTSP/1.0\r\n
// CSeq: 3\r\n
// Transport: RTP/AVP/UDP;client_port=1234-1235\r\n
// \r\n

2.3.2 解析流程:

步骤 解析内容 关键逻辑
1 跳过开头空白 忽略 \r\n\t
2 提取命令名 读取到第一个空格为止
3 识别协议类型 检测 rtsp://rtsps://
4 提取URL路径 解析 RTSP/1.0 之前的URL部分
5 解析 CSeq 查找 CSeq: 头,提取序列号
6 解析 Session 查找 Session: 头(可选)
7 解析 Content-Length 查找 Content-Length: 头(可选)

2.3.3 Range 范围参数解析

支持多种时间格式:

格式 示例 说明
NPT (Normal Play Time) npt=10.0-20.0 相对时间,单位秒
NPT 带时分秒 npt=00:01:30-00:02:00 时:分:秒格式
NPT now npt=now- 从当前时刻开始
Clock clock=20230101T120000Z- UTC 绝对时间
SMPTE smpte=... 电影时间码(仅支持,未解析)

2.4 协议状态转换

复制代码
         ┌──────────────┐
         │   已断开     │
         └──────┬───────┘
                │ TCP连接
                ▼
         ┌──────────────┐
         │   已连接     │◄─────────────────────┐
         └──────┬───────┘                      │
                │ OPTIONS/DESCRIBE             │
                ▼                              │
         ┌──────────────┐                      │
         │   会话协商   │                      │
         └──────┬───────┘                      │
                │ SETUP                        │
                ▼                              │
         ┌──────────────┐                      │
         │   已建立     │◄───────┐             │
         └──────┬───────┘        │             │
                │ PLAY            │             │
                ▼                 │             │
         ┌──────────────┐        │             │
         │   播放中     │────────┤             │
         └──────┬───────┘        │             │
                │ PAUSE/PLAY     │             │
                ▼                │             │
         ┌──────────────┐        │             │
         │   已暂停     │────────┘             │
         └──────┬───────┘                      │
                │ TEARDOWN                     │
                ▼                              │
         ┌──────────────┐──────────────────────┘
         │   已断开     │
         └──────────────┘

三、协议详细步骤

3.1 TCP连接建立

步骤 操作 说明
1-1 客户端发起 TCP 连接 连接到服务器默认端口 554 (RTSP)或 322(RTSPS)
1-2 TCP 三次握手完成 建立可靠的传输通道
复制代码
客户端 → SYN → 服务器
客户端 ← SYN+ACK ← 服务器
客户端 → ACK → 服务器

3.2 OPTIONS - 查询服务器能力

作用:客户端查询服务器支持的 RTSP 命令列表。

3.2.1 客户端请求:

复制代码
OPTIONS rtsp://192.168.1.1:554/stream RTSP/1.0
CSeq: 1
User-Agent: LIVE555 Streaming Media v2026.07.04

3.2.2 服务器响应:

复制代码
RTSP/1.0 200 OK
CSeq: 1
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, GET_PARAMETER, SET_PARAMETER
Date: Wed, 04 Jul 2026 12:00:00 GMT

3.3 DESCRIBE - 获取媒体描述

作用:获取媒体会话的 SDP(Session Description Protocol)描述,包含:

  • 媒体类型(视频/音频)
  • 编码格式(H264、PCMU等)
  • RTP 负载类型
  • 时钟频率

客户端请求:

复制代码
DESCRIBE rtsp://192.168.1.1:554/stream RTSP/1.0
CSeq: 2
Accept: application/sdp
User-Agent: LIVE555 Streaming Media v2026.07.04

服务器响应(包含 SDP):

复制代码
RTSP/1.0 200 OK
CSeq: 2
Content-Type: application/sdp
Content-Length: 384
Date: Wed, 04 Jul 2026 12:00:01 GMT

v=0
o=- 12345 67890 IN IP4 192.168.1.1
s=Live Stream
i=H264 Video Stream
t=0 0
a=tool:LIVE555 Streaming Media
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
a=rtpmap:96 H264/90000
a=fmtp:96 profile-level-id=4D401F;sprop-parameter-sets=Z00AHukCgH8BQAAAAwAAA...
m=audio 0 RTP/AVP 0
c=IN IP4 0.0.0.0
a=rtpmap:0 PCMU/8000

3.4 SETUP - 建立传输通道

作用:协商传输参数,建立 RTP/RTCP 通道:

  • 指定客户端端口范围(RTP: 1234, RTCP: 1235)
  • 服务器分配端口(RTP: 5000, RTCP: 5001)
  • 返回 Session ID(后续请求必需)

多轨道处理:如果有多个媒体轨道(如视频+音频),需要为每个轨道发送独立的 SETUP 请求。

客户端请求(视频轨道):

复制代码
SETUP rtsp://192.168.1.1:554/stream/track1 RTSP/1.0
CSeq: 3
Transport: RTP/AVP/UDP;client_port=1234-1235
User-Agent: LIVE555 Streaming Media v2026.07.04

服务器响应:

复制代码
RTSP/1.0 200 OK
CSeq: 3
Session: 8976543210;timeout=60
Transport: RTP/AVP/UDP;client_port=1234-1235;server_port=5000-5001;ssrc=0x12345678
Date: Wed, 04 Jul 2026 12:00:02 GMT

3.5 PLAY - 开始播放

关键参数:

  • Range :播放范围(npt=0.0- 表示从开始播放到结束)
  • Scale:播放速度(1.0 = 正常速度)
  • RTP-Info:包含 RTP 序列号和时间戳

客户端请求:

复制代码
PLAY rtsp://192.168.1.1:554/stream RTSP/1.0
CSeq: 4
Session: 8976543210
Range: npt=0.0-
Scale: 1.0
User-Agent: LIVE555 Streaming Media v2026.07.04

服务器响应:

复制代码
RTSP/1.0 200 OK
CSeq: 4
Session: 8976543210
RTP-Info: url=rtsp://192.168.1.1:554/stream/track1;seq=12345;rtptime=987654321
Date: Wed, 04 Jul 2026 12:00:03 GMT

3.6 RTP/RTCP 数据传输

PLAY 之后,服务器开始通过 RTP/RTCP 传输媒体数据:

RTCP 功能

  • SR(Sender Report):发送方报告,包含发送统计

  • RR(Receiver Report):接收方报告,包含丢包率、延迟等

  • SDES(Source Description):源描述信息

  • BYE:结束传输通知

    ┌─────────────────────────────────────────────────────────────────┐
    │ RTP/RTCP 数据传输 │
    ├─────────────────────────────────────────────────────────────────┤
    │ │
    │ 服务器 ──► RTP (视频数据) ──► 客户端 (UDP 5000) │
    │ 服务器 ──► RTCP (控制信息) ──► 客户端 (UDP 5001) │
    │ │
    │ RTP 包结构: │
    │ ┌────────┬────────┬────────┬────────┬──────────────┐ │
    │ │版本(2) │填充标志│扩展标志│CSRC计数│序列号(16位) │ │
    │ ├────────┼────────┼────────┼────────┼──────────────┤ │
    │ │ 时间戳(32位) │ SSRC(32位) │ │
    │ ├─────────────────────────────────┴──────────────┤ │
    │ │ RTP 负载数据 │ │
    │ │ (H264 NAL单元 / PCMU音频) │ │
    │ └──────────────────────────────────────────────────┘ │
    │ │
    └─────────────────────────────────────────────────────────────────┘

3.7 TEARDOWN - 结束会话

作用:释放会话资源,关闭 RTP/RTCP 通道。

客户端请求:

复制代码
TEARDOWN rtsp://192.168.1.1:554/stream RTSP/1.0
CSeq: 5
Session: 8976543210
User-Agent: LIVE555 Streaming Media v2026.07.04

服务器响应:

复制代码
RTSP/1.0 200 OK
CSeq: 5
Session: 8976543210
Date: Wed, 04 Jul 2026 12:05:00 GMT

四、

相关推荐
骄傲的心别枯萎2 个月前
RTSP的原理讲解
音视频·rtsp
oushaojun22 个月前
使用live555搭建rtsp服务器
rtsp·live555
while(1){yan}3 个月前
RTSP流协议
rtsp·流协议
sp42a3 个月前
通过 RootEncoder 进行安卓直播 RTSP 推流
android·推流·rtsp
阿拉斯攀登3 个月前
网页播放 4 路 RTSP 摄像头(零配置、一键运行)
rtsp·视频分屏
sheldon_blogs4 个月前
Android设备搭建本地RTSP服务器(基于live555)
rtsp
REDcker5 个月前
RTSP 直播技术详解
linux·服务器·网络·音视频·实时音视频·直播·rtsp
小李独爱秋5 个月前
计算机网络经典问题透视:RTP首部三剑客——序号、时间戳与标记的使命
服务器·计算机网络·web安全·信息与通信·rtsp
小李独爱秋5 个月前
计算机网络经典问题透视:RTP协议能否提供应用分组的可靠传输?
服务器·计算机网络·web安全·信息与通信·rtsp