参考:手撕RTSP协议系列(1)——Rtsp基本流程-腾讯云开发者社区-腾讯云 (tencent.com)系列文章,如有问题可参考原系列文章内容
1 rtsp协议简介
rtsp,英文全称 Real Time Streaming Protocol,RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议!协议主要规定定了一对多应用程序如何有效地通过IP网络传送多媒体数据。RTSP体系结位于RTP和RTCP之上(RTCP用于控制传输,RTP用于数据传输),使用TCP或UDP完成数据传输!
2 rtsp基本交互过程
假设我们现在要向一个RTSP的sever发送请求获取数据,基本流程如下:
OPTIONS:
C--->S
客户端向服务器端发送OPTIONS,请求可用的方法。
OPTIONS rtsp://182.182.4.3:9554 RTSP/1.0
CSeq: 1
User-Agent: mpv 0.29.1
S--->C
服务器端回复客户端,消息中包含当前可用的方法。
RTSP/1.0 200 OK
CSeq: 1
Public: DESCRIBE, SETUP, TEARDOWN, PLAY
DESCRIBE:
C--->S
客户端向服务器请求媒体描述文件,一般通过rtsp开头的url来发起请求,格式为sdp。
DESCRIBE rtsp://182.182.4.3:9554 RTSP/1.0
Accept: application/sdp
CSeq: 2
User-Agent: mpv 0.29.1
S--->C
(不需要认证,则直接返回sdp。)服务端收到带认证信息的DESCRIBE请求之后,如果信息正确,则会回复200 ok的消息,同时返回sdp信息
RTSP/1.0 200 OK
CSeq: 2
Content-Base: rtsp://182.182.4.3:9554
Content-Type: application/sdp
Content-Length: 253
v=0 描述: 表示sdp的版本号,不包含次版本号
o=- 0 0 IN IP4 1.2.3.4描述:o=选项对会话的发起者进行了描述;
o=
<username>:是用户的登录名, 如果主机不支持<username>,则用"-"代替,<username> 不能包含空格;
<session id>:是一个数字串,在整个会话中,必须是唯一的,建议使用个NTP 时间戳;
<version>: 该会话公告的版本,供公告代理服务器检测同一会话的如果干个公告哪个是最新公告,基本要求是会话数据修改后该版本值递增,建议使用NTP时间戳
<networktype>: 网络类型,一般为"IN",表示internet
<addresstype>: 地址类型,一般为IP4
<adress>:地址
s=- 格式:s=会话名称,在整个会话中有且只有1个"s="
t=0 0 格式:t= start time和stop time均为0,表示一个持久的会话。
m=video 0 RTP/AVP 96 media information格式:m=
a=rtpmap:96 H265/90000rtpmap
格式:a=rtpmap: /
描述:
payload type表示动态负载类型,如 98表示h264
encoding name表示编码名称,如H.264
clock rate表示时钟频率,如90000
m=audio 0 RTP/AVP 98
a=rtpmap:98 MPEG4-GENERIC/48000/1
a=fmtp:98 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=118856E500
SETUP:
C--->S
客户端向服务器端发起建立连接请求,请求建立会话连接,准备开始接收音视频数据,请求信息描述了期望音视频数据包基于UDP还是TCP传输,指定了RTP,RTCP端口,以及是单播还是组播等信息!
SETUP rtsp://182.182.4.3:9554 RTSP/1.0
Transport: RTP/AVP/UDP;unicast;client_port=23366-23367
CSeq: 3
User-Agent: mpv 0.29.1
S--->C
服务器端收到客户端请求后,根据客户端请求的端口号确定发送控制数据的端口以及音视频数据的端口!
请求之后,如果没有异常情况,RTSP服务器的回复比较简单,回复200 OK消息,同时在Transport字段中增加sever_port,指明对等的服务端RTP和RTCP传输的端口,增加ssrc字段,增加mode字段,同时返回一个session id,用于标识本次会话连接,之后客户端发起PLAY请求的时候需要使用该字段
RTSP/1.0 200 OK
CSeq: 3
Transport: RTP/AVP;unicast;client_port=23366-23367;server_port=35004-35005;ssrc=2100238178
Session: 1234
SETUP rtsp://182.182.4.3:9554 RTSP/1.0
Transport: RTP/AVP/UDP;unicast;client_port=23368-23369
CSeq: 4
User-Agent: mpv 0.29.1
Session: 1234
RTSP/1.0 200 OK
CSeq: 4
Transport: RTP/AVP;unicast;client_port=23368-23369;server_port=35004-35005;ssrc=1084322566
Session: 1234
PLAY:
C--->S
客户端向服务端请求播放媒体。
PLAY rtsp://182.182.4.3:9554 RTSP/1.0
Range: npt=0.000-
CSeq: 5
User-Agent: mpv 0.29.1
Session: 1234
S--->C
服务器回复客户端200 OK! 之后开始通过SETUP中指定的端口开始发送数据!
RTSP/1.0 200 OK
CSeq: 5