【rtspserver】协议篇 - RTSP协议

1.RTSP协议概述

RTSP标准手册:
https://datatracker.ietf.org/doc/html/rfc2326

RTSP(Real Time Streaming Protocaol),RFC2326,实时流传输协议,属于应用层协议,此协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。RTSP在体系结构上位于RTP和RTCP之上,使用TCP和UDP完成数据传输

Real-time Transport Protocol或简写RTP,RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式。它是创建在UDP协议之上

Real-time Transport Control Protocol或RTP Control Protocol或简写RTCP)是实时传输协议(RTP)的一个姐妹协议。RTCP由RFC 3550定义(取代作废的RFC 1889)。RTP 使用一个 偶数 UDP port ;而RTCP 则使用 RTP 的下一个 port,也就是一个奇数 port。RTCP与RTP联合工作,RTP实施实际数据的传输,RTCP则负责将控制包送至电话中的每个人。其主要功能是就RTP正在提供的服务质量做出反馈。

简单的说,以上三个协议就是负责以下图片内容:

image

1.1 基本特性

  • 工作方式:基于文本的客户端-服务器协议
  • 默认端口: 554 (TCP/UDP)
  • 协议定位: 介于应用层和传输层之间
  • 与HTTP关系:语法和操作类似HTTP,但不兼容

2.RTSP协议特点

1.控制协议:仅负责媒体会话控制,不直接传输媒体数据

2.状态协议:维护会话状态

3.多传输支持:可与RTP/RTCP、TCP、UDP等配合使用

4.时间敏感性:支持NTP时间戳

5.扩展性:支持自定义方法和头部

3.RTSP核心方法

方法 功能描述
OPTIONS 查询服务器支持的方法
DESCRIBE 获取媒体描述信息(SDP格式)
ANNOUNCE 客户端或服务器更新会话描述
SETUP 建立传输会话,指定传输方式
PLAY 开始数据传输
PAUSE 暂停数据传输
RECORD 启动媒体录制
TEARDOWN 终止会话,释放资源
GET_PARAMETER 查询参数值
SET_PARAMETER 设置参数值

4.RTSP重要头部字段

头部字段 说明
CSeq 命令序列号,用于匹配请求响应
Session 会话标识符
Transport 指定传输参数(RTP/AVP;unicast;client_port=8000-8001)
Range 指定播放时间范围
Authorization 认证信息
Content-Type 内容类型(通常为application/sdp)
Content-Length 内容长度

5.RTSP传输模式

RTP over UDP

  • 媒体数据通过RTP over UDP传输
  • 控制命令通过RTSP over TCP传输
  • 需要打开额外端口

2.RTP over TCP

  • 媒体数据和控制命令共用TCP连接
  • 媒体数据以$前缀标识
  • 格式: $ + 1字节通道号 + 2字节长度 + 数据

3.Multicast

  • 服务器选择组播地址和端口
  • 客户端加入组播组接收数据

6.RTSP状态码

状态码 含义
200 OK - 请求成功
400 Bad Request - 错误请求
401 Unauthorized - 未授权
404 Not Found - 未找到
405 Method Not Allowed - 方法不允许
456 Header Field Not Valid - 头部字段无效
461 Unsupported Transport - 不支持的传输
500 Internal Server Error - 服务器内部错误
503 Service Unavailable - 服务不可用

7.SDP协议(会话描述协议)

RTSP使用SDP描述媒体信息,包含:

  • 会话名称和目的
  • 媒体类型(视频/音频等)
  • 传输协议(RTP/UDP等)
  • 媒体格式(H.264/MPEG-4等)
  • 媒体传输地址和端口

示例SDP片段:

v=0
o=- 123456 1 IN IP4 192.168.1.1
s=Example Stream
t=0 0
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=control:track1

8.RTSP协议完整交互流程

RTSP 交互 = OPTIONS → DESCRIBE → SETUP × N → PLAY → [PAUSE] → TEARDOWN,配合 RTP/RTCP 完成媒体传输。

image

以客户端要播放的URL为 tsp://192.168.1.100:554/stream 的视频流

8.1 OPTIONS - 探测服务器

作用:查询服务器支持哪些RTSP方法

// Client -> Server
OPTIONS rtsp://192.168.1.100:554/stream RTSP/1.0
CSeq: 1
User-Agent: LibVLC/3.0

// Server → Client
RTSP/1.0 200 OK
CSeq: 1
Public: OPTIONS, DESCRIBE, SETUP, PLAY, PAUSE, TEARDOWN, GET_PARAMETER

User-Agent:当前网路请求是以LibVLC 3.0版本库的程序发起
CSeq : 请求序列号
Public:列出服务器支持的方法

8.2 DESCRIBE - 获取媒体描述(SDP)

作用:获取流的元数据,比如:编码格式,分辨率,通道数等,以SDP的格式返回

// Clinet → Server
DESCRIBE rtsp://192.168.1.100:554/stream RTSP/1.0 
CSeq: 2                           // 命令序列号
Accept: application/sdp           // 期望Server以SDP格式返回描述
User-Agent: LibVLC/3.0            // 客户端是基于VLC构建的应用

// Server → Client
RTSP/1.0 200 OK
CSeq: 2
Content-Base: rtsp://192.168.1.100:554/stream/       // 基准URL,后续SETUP中请求的轨道将基于此拼接
Content-Type: application/sdp                        // 响应体是SDP格式,符合客户端Accept要求
Content-Length: 376                                  // SDP 内容长度为 376 字节,用于接收端判断数据是否完整。

// 以下为sdp主体内容
v=0
o=- 123456 1 IN IP4 192.168.1.100
s=Streaming Session
c=IN IP4 0.0.0.0
t=0 0
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=42001F;sprop-parameter-sets=Z0IAH5WoFAFuQA==,aM48gA==
a=control:trackID=1
m=audio 0 RTP/AVP 97
a=rtpmap:97 MPEG4-GENERIC/44100/2
a=control:trackID=2

sdp主体逐行解析:

  • 会话级描述(session-level)
含义
v=0 SDP协议版本号(目前只有0)
o=- 123456 1 IN IP4 192.168.1.100 会话所有者/创建者信息:
- : 用户名(匿名)
123456 : 会话ID
1 : 版本号
IN IP4 192.168.1.100:网络类型+创建者IP
s=Streaming Session 会话名称
c=IN IP4 0.0.0.0 连接信息,表示媒体流地址不会在会话级指定,而在每个媒体行(m=)中单独定义
t=0 0 时间描述:start = 0,stop = 0,表示永久会话(无结束时间),使用于直播流
  • 媒体级描述(Media-level) - 视频轨道
含义
m=video 0 RTP/AVP 96 媒体行:
video : 媒体类型
0 : 端口号(RTSP 中通常为 0,实际端口由 SETUP 协商)
RTP/AVP : 传输协议(RTP Audio/Video Profile)
96 : RTP payload type(动态类型)
a=rtpmap:96 H264/90000 属性行:
96对应H.264编码,时钟频率90000Hz(视频标准)
a=fmtp:96 ... 格式参数
packetization-mode = 1: 支持交错打包
profile-level-id:H.264 BaseLine Profile Level 3.1 
sprop-parameter-sets:SPS/PPS基础编码,解码器初始化必需
a=control:trackID=1 关键字段:
用于构造SETUP请求的URL:
rtsp://.../stream/trackID=1
  • 媒体级描述 - 音频轨道
含义
m=audio 0 RTP/AVP 97 音频媒体,payload type 97。
a=rtpmap:97 MPEG4-GENERIC/44100/2 AAC-LC 音频(MPEG4-GENERIC),采样率 44.1kHz,双声道
a=control:trackID=2 音频轨道控制 URL 后缀为 trackID=2

8.3 SETUP - 建立媒体通道

作用:为每个媒体轨道(如 video、audio)协商传输参数(UDP/TCP、端口、单播/组播)。

比如:设置视频轨道(trackID=1)

// Client → Server
SETUP rtsp://192.168.1.100:554/stream/trackID=1 RTSP/1.0
CSeq: 3
Transport: RTP/AVP;unicast;client_port=5000-5001
User-Agent: LibVLC/3.0

// Server → Client
RTSP/1.0 200 OK
CSeq: 3
Session: 12345678;timeout=60
Transport: RTP/AVP;unicast;source=192.168.1.100;server_port=6000-6001;client_port=5000-5001

Transport :

RTP/AVP:使用RTP over UDP(RTP/AVP/TCP表示TCP interleaved 模式)

client_port = 5000-5001:客户端RTP端口5000,RTCP端口5001

server_port=6000-6001: 服务器分配的发送端口

Session : 12345678:会话ID,后续所有请求必须携带此字段

若有音频轨道,需对trackID = 2再发一次SETUP

Note:

TCP intgerleaved模式(RTP over TCP),当防火墙阻断UDP时,可使用TCP传输RTP:

// SETUP 请求
Transport: RTP/AVP/TCP;unicast;interleaved=0-1

// 响应
Transport: RTP/AVP/TCP;unicast;interleaved=0-1

interleaved=0-1 : RTP 包用 $0 前缀,RTCP 用 $1,嵌入在 RTSP TCP 连接中

8.4 PLAY - 开始播放媒体流

作用:命令服务器开始通过RTP发送媒体数据

// Client → Server
PLAY rtsp://192.168.1.100:554/stream RTSP/1.0
CSeq: 4
Session: 12345678
Range: npt=0.000-

// Server → Client
RTSP/1.0 200 OK
CSeq: 4
Session: 12345678
RTP-Info: url=trackID=1;seq=12345;rtptime=789012345

Range: npt=0.000- : 从时间0开始播放(npt = Normal Play time)

RTP-Info: url=trackID=1;seq=12345;rtptime=789012345 : 返回初始RTP序列号和时间戳,用于同步

此时服务器开始向客户端5000/5001端口发送RTP/RTCP包

8.5 PAUSE/RESUME - 暂停/恢复

// 暂停
PAUSE rtsp://... RTSP/1.0
CSeq: 5
Session: 12345678

// 恢复(再次发送 PLAY)
PLAY rtsp://... RTSP/1.0
CSeq: 6
Session: 12345678
Range: npt=10.000-  // 从 10 秒处继续

8.6 TEARDOWN - 终止会话

作用:释放服务器资源,关闭RTP流

// Client → Server
TEARDOWN rtsp://192.168.1.100:554/stream RTSP/1.0
CSeq: 7
Session: 12345678

// Server → Client
RTSP/1.0 200 OK
CSeq: 7
Session: 12345678
Connection: Close

服务器停止发送RTP数据,销毁会话上下文

posted @ 2025-05-18 22:44  Emma1111  阅读(173)  评论(0)    收藏  举报