RTSP协议是一种用于控制实时媒体流传输和管理客户端与服务器之间的会话的应用层协议,它通常用于控制音视频流的播放、暂停和停止等操作。
RTSP本身不直接传输音视频数据,通过和RTCP,RTP一起配合使用,RTSP用来传输控制信息,RTCP传输网络质量反馈信息,RTP用来传输音视频数据,RTP协议一般是基于UDP的,用来提供低延迟的音视频传输。
RTSP一般用于点播,直播,实时监控等实时性较强的场景,由于RTP是基于UDP协议的,所以RTSP要比RTMP具有更低的延迟。
RTSP协议中,服务器与客户端一开始的连接协商过程可分为:
- 客户端发起连接(OPTIONS 请求)
- 获取媒体描述信息(DESCRIBE 请求)
- 建立传输通道(SETUP 请求)
- 开始播放(PLAY 请求)
而断开的过程:
客户端/服务器发送 TEARDOWN 请求,双方均可主动发送断开连接的TEARDOWN请求进行连接断开。
RTSP发送的请求信息是以文本格式进行传输的。其中:
1.OPTION请求
OPTIONS rtsp://example.com/media.mp4 RTSP/1.0
CSeq: 1
User-Agent: VLC media player
CSeq:序列号,用于匹配请求与响应(必须递增)。
User-Agent:标识客户端类型。
OPTION响应
RTSP/1.0 200 OK
CSeq: 1
Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE
Public:列出服务器支持的方法。
2.DESCRIBE请求
DESCRIBE rtsp://example.com/media.mp4 RTSP/1.0
CSeq: 2
Accept: application/sdp
Accept:指定客户端支持的响应格式(如SDP)。
DESCRIBE响应
RTSP/1.0 200 OK
CSeq: 2
Content-Type: application/sdp
Content-Length: 123
v=0
o=- 123456 1 IN IP4 192.168.1.1
s=Example Stream
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
...
SDP内容:包含媒体类型(视频/音频)、编解码格式(如H.264)、传输协议(RTP/AVP)、端口等。
3.SETUP 请求
SETUP rtsp://example.com/media.mp4/track1 RTSP/1.0
CSeq: 3
Transport: RTP/AVP;unicast;client_port=8000-8001
Transport:指定传输参数:
RTP/AVP:用UDP去传输RTP数据。如果要用TCP传输,更改它,显示指定为: RTP/AVP/TCP。
unicast/multicast:单播或多播。
client_port:客户端接收RTP/RTCP的端口。
SETUP 响应
RTSP/1.0 200 OK
CSeq: 3
Session: 12345678
Transport: RTP/AVP;unicast;server_port=9000-9001;client_port=8000-8001
Session:服务器分配的会话ID,后续请求需携带。
Transport:服务器确认的传输参数(如服务器和客户端端口等)。
4.PLAY 请求
PLAY rtsp://example.com/media.mp4 RTSP/1.0
CSeq: 4
Session: 12345678
Range: npt=0-
Range:指定播放范围(如npt=0-表示从开始播放,没有指定结束范围表示实时(直播/监控)流等)。
Session:必须与SETUP响应中的一致。
PLAY 响应
RTSP/1.0 200 OK
CSeq: 4
Session: 12345678
RTP-Info: url=rtsp://example.com/media.mp4/track1;seq=1234;rtptime=5678
RTP-Info:返回RTP流的初始序列号和初始时间戳。
RTP包头结构:
版本(V):10(版本 2)。 表示: RTP版本号,通常为 2(当前标准)。
填充(P):0(无填充)。表示: 为 1 时,包末尾包含填充字节(用于加密或对齐)
扩展(X):0(无扩展)。表示: 为 1 时,固定头部后存在扩展头部。
CSRC 计数(CC):0000(0 个 CSRC)。表示: 指定CSRC标识符的个数(0-15),用于混合器场景。
标记(M):0(普通包)。表示: 由应用定义,如视频流中标记帧的结束。
负载类型(PT):60(动态分配的负载类型)。表示: 标识载荷格式(如音频/视频编码类型),需参考具体协议(如RFC 3551)。
序列号(Sequence Number):0001(序列号为 1)。表示: 每发送一个RTP包递增1,用于检测丢包和乱序。
时间戳(Timestamp):00000002(时间戳为 2)。表示: 反映载荷数据的采样时刻,单位由载荷类型决定(如视频/音频的采样间隔)
同步源(SSRC):00000003(SSRC 为 3)。表示: 唯一标识数据源,防止冲突(如多个视频流混合时)。
RTCP包头的结构(8字节),结构如下:
字段名 | 比特位 | 长度 | 说明 |
---|---|---|---|
Version (V) | 0-1 | 2 | 版本号(固定为2,与RTP一致)。 |
Padding § | 2 | 1 | 为1时,包末尾包含填充字节(用于加密对齐)。 |
Reception Report Count (RC) | 3-7 | 5 | 报告块(Report Block)的数量(如RR包中的接收报告数)。 |
Packet Type (PT) | 8-15 | 8 | RTCP包类型(见下表)。 |
Length (Length) | 16-31 | 16 | 整个RTCP包的32位字(Word)数减1(包括头部)。 |
SSRC/CSRC | 32-63 | 32 | 同步源(SSRC)或贡献源(CSRC)标识符。 |
类型值(PT) | 名称 | 用途 |
---|---|---|
200 | Sender Report (SR) | 发送端报告,包含发送统计信息(如RTP包数、字节数)。 |
201 | Receiver Report (RR) | 接收端报告,反馈接收质量(如丢包率、抖动)。 |
202 | Source Description (SDES) | 源描述信息(如CNAME、EMAIL等标识)。 |
203 | BYE | 会话终止通知(如参与者离开)。 |
204 | APP | 应用自定义数据。 |
Sender Report (SR)发送者报文结构:
(由媒体发送端(如视频服务器或者推流端)周期性发送,包含发送统计和接收反馈。)
NTP Timestamp:64位,表示SR包的绝对发送时间(用于跨设备同步和接收端延迟抖动等的计算)。
RTP Timestamp:32位,与NTP时间戳对应的RTP时间戳(同一时钟域)。
Sender’s Packet/Octet Count:累计发送的RTP包数和字节数。用于接收端统计丢包率返回给发送方。
Report Block:可选,包含接收端反馈(格式同RR包)。
Receiver Report (RR)
(由接收端(如播放器)发送,用来反馈网络质量的。)
Loss Fraction:8位,丢包比例(0255,表示0%100%)。
Cumulative Packets Lost:24位,累计丢包数。
Interarrival Jitter:32位,网络抖动(RTP包到达时间方差)。
Source Description (SDES)
(传递参与者标识信息(如CNAME用于跨流同步),其实就是一个网络上的唯一标识CNAME对应多条流,视频或者音频或者字幕流,然后用这个唯一标识CNAME去映射统计它有哪些流ID,方便服务器管理以及拉流客户端同步多条流。由服务器或者推流端发送)
(CNAME): 规范名称(唯一标识,格式如user@host)。
(NAME): 用户昵称。
(EMAIL): 电子邮件地址。
BYE
(通知其他参与者离开会话。客户端和服务器都可主动发送)
播放时间计算公式
视频播放时间 = 视频RTP时间戳 + (NTP当前时间 - NTP参考时间)
音频播放时间 = 音频RTP时间戳 + (NTP当前时间 - NTP参考时间)
其中RTP时间戳和NTP参考时间是在包中的,NTP当前时间是主机的本地NTP时间。
多条流之间的同步:
用户Alice同时发送音频和视频流:
音频流:SSRC=1111,CNAME=alice@laptop
视频流:SSRC=2222,CNAME=alice@laptop接收端/拉流端发现两个流的CNAME相同:
提取音频SR包的NTP时间戳(T1)和视频SR包的NTP时间戳(T2)。
计算时间差(T2 - T1),计算相对延迟,调整播放时序 (调整视频缓冲延迟,实现两条或者多条流的同步)。