目录
一、前言
二、RTSP的信令格式
三、RTSP的通信过程
四、RTSP服务器设计
五、RTSP客户端设计
《rtsp 服务端使用TCP/UDP传输音视频代码实现》链接:
https://edu.csdn.net/learn/38258/606138?spm=1003.2001.3001.4157
https://edu.csdn.net/learn/38258/606140?spm=1003.2001.3001.4157
https://edu.csdn.net/learn/38258/606141?spm=1003.2001.3001.4157
《rtsp 客户端使用TCP/UDP接收音视频代码实现》链接:
https://edu.csdn.net/learn/38258/606142?spm=1003.2001.3001.4157
RTSP(Real Time Streaming Protocol)实时流协议,是一种网络应用层协议。该协议用于创建和控制终端之间的媒体会话。媒体客户端发布命令,例如播放,关闭,以便于实时控制从服务器到客户端或从客户端到服务器的媒体流。通常RTSP的任务并不包含传输流媒体数据,流媒体数据传输通过RTP(Real-time Transport Protocol)协议和RTCP(Real-time Transport Control Protocol)协议结合来进行流媒体数据传输。RTP协议详细说明了在网络上传递音频和视频的数据如何进行数据包格式的封装。RTCP的主要功能是为RTP所提供的服务质量(Quality of Service)提供反馈,例如:传输字节数,传输分组数,丢失分组数,jitter,单向和双向网络延迟等等,网络应用程序即可利用RTCP的统计信息来控制传输的品质,比如当网络带宽 不足等时候可以降低编码码率,网络带宽多余的时候提升编码码率。
下图左侧是RTSP程序中RTSP协议和RTP/RTCP协议的关系;在RTSP层序中RTSP协议通过TCP传输双方交互的信令;双方通过信令来确定流媒体传输RTP数据包的方式是UDP还是TCP以及确定传输的端口号;当流媒体传输方式为TCP时候通常只需要按照RTP协议将流媒体数据封装为若干个RTP包,在通过TCP网络发送给对方,由于TCP协议面向连接能保证对方收到RTP包,不会出现丢包、乱序等,所以通常TCP发送RTP包等时候不需要RTCP协议。当流媒体传输方式为UDP时候需要按照RTP协议将流媒体数据封装为若干个RTP包,在通过UDP网络发送给对方,由于UDP协议不能保证对方收到RTP包,可能出现丢包、乱序等,所以通常UDP发送RTP包等时候需要RTCP协议来提供服务质量反馈。下图右侧是RTSP协议和RTP/RTCP协议在网络四层模型中所处的位置。RTSP处于应用层,RTP/RTCP通常认为是传输层(也有认为是应用层)。
RTSP 协议标准文档:RFC 2326 - Real Time Streaming Protocol (RTSP)
RTSP通常是服务器客户端模型,就是客户端网服务器发起请求,服务器返回给客户端一个应答消息。接下来我们就介绍下信令请求和应答的格式。下图是信令请求的格式,第一行(首行,也叫Request-Line)包含了方法、URL、版本信息以及空格、回车换行。方法通常包含OPIONS、DESCRIBE、SETUP、PLAY、TEARDOWN等;方法是RTSP为了双方通信过程消息的有序性,通常方法的请求/响应需要按照一定顺序,比如PLAY方法请求/响应前需要先进行SETUP的请求/响应。URL里面包含了协议、IP、端口号、路径等。版本信息 通常固定为"RTSP/1.0,表示采用RTSP的1.0版本。CRLF表示回车换行,对应的字符为“\r\n”。在第一个行之后接下来是消息行,通常一个信令包含多个消息行。消息行包含消息头(也叫request-header)、消息值、回车换行。在最后一个消息行之后需要额外添加回车换行,也就是最后一个消息行的消息值之后需要两个回车换行。消息头常见的有Cseq、Public、Content-Type、Transport、Session等。消息头和消息值之间通过冒号(:)分开。消息值表示消息头具体的内容,如Cseq 取值为0,1,2,3等整数。
下图是信令应答的格式,第一行(首行,也叫Status-Line)包含了版本信息、状态码、状态码描述短语及空格、回车换行。版本信息和请求首行里面的版本信息一致。状态码为返回的状态,如200是返回成功,501表示失败,状态码描述短语通常用于描述状态码的含义,如状态码为200则状态码描述短语为"OK",如状态码为501则状态码描述短语为"Not Implemented"。CRLF表示回车换行,对应的字符为“\r\n”。在第一个行之后接下来是消息行(也叫response-header),通常一个信令包含多个消息行。消息行包含消息头、消息值、回车换行。在最后一个消息行之后需要额外添加回车换行,也就是最后一个消息行的消息值之后需要两个回车换行。消息头常见的有Cseq、Public、Content-Type、Transport、Session等。消息头和消息值之间通过冒号(:)分开。消息值表示消息头具体的内容,如Cseq 取值为0,1,2,3等整数。实体主体通常在返回SDP信息的时候会出现。
RTSP中定义的状态码如下图所示。在需要用户名和密码的RTSP中如果用户名密码错误通常返回401的状态码。
消息头的定义以及使用如下图所示;methods表示当前消息头是否需要出现在当前方法请求/应答信令消息中。如在SETUP方法的请求和应答都需要Transport这个消息头。
RTSP中常见消息头的的描述/作用如下表所示。
消息头 | 描述 |
CSeq | 方法请求序列;值是一个递增数值,必须出现在所有请求中,应答则返回相同的值。在不同的方法中该数值不同。 |
Public | 通常用于应答,表示支持的方法有哪些 |
Content-Type | 是HTTP协议里面定义的内容类型,比如RTSP 会请求application/sdp的数据 |
Content-Length | Content-Type指定类型数据的长度。 |
Accept | 用于请求指定流媒体的描述性内容,比如application/sdp |
User-Agent | 是一个特殊字符串头,使得服务器能够识别客户使用的操系统及版本、CPU类型、浏览器及版本、浏览器渲染引擎、浏览器语言等 |
Session | 8位数以上的会话ID |
Transport | 约定的传输协议类型(TCP/UDP)、端口号,广播模式(点播/单播、多播等) |
Server | 服务端的标识名称、版本等字符串信息 |
WWW-Authenticate | 身份认证,包含用户名、认证方式、摘要信息等 |
在RTSP 客户端请求RTSP服务器的情况下,通常是客户端按照一个方法往客户端发起请求(C->S),服务器收到对应方法回给予客户端应答(S->C)。RTSP中的常用方法如下表所示。
方法 | 请求方向 | 描述 |
OPTIONS | C->S/S->C | (通常户端向服务器发送)向对方请求/查询对方可以用的方法 |
DESCRIBE | C->S | 请求/查询对方的多媒体描述信息,通常会返回SDP信息。 |
SETUP | C->S | 请求用于流媒体的传输机制,如使用TCP/UDP传输RTP,端口号等信息 |
PLAY | C->S | 告诉服务器以SETUP指定的机制开始发送RTP数据 |
TEARDOWN | C->S | TEARDOWN请求停止给定URL流发送,释放相关资源,通常用于关闭RTSP |
SET_PARAMETER | C->S/S->C | 请求设置URL指定流的参数值 |
GET_PARAMETER | C->S/S->C | 请求检查URL指定的流媒体的参数值 |
下图是RTSP 客户端(Client)和服务端(Server)的交互过程蓝色是客户端的数据发送,绿色是服务端的数据发送(作为对客户端的响应),橙色是RTP数据的发送。
OPTIONS交互信令如下:
客户端往服务器发送请求;
OPTIONS rtsp://127.0.0.1:554/live/chn0 RTSP/1.0
CSeq: 2
User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)
服务器给客户端返回可以使用的方法;服务器可用的方法在Public字段中。
RTSP/1.0 200 OK
CSeq: 2
Public: DESCRIBE, SETUP, TEARDOWN, PLAY
DESCRIBE交互信令如下:
客户端往服务器发送请求;
DESCRIBE rtsp://127.0.0.1:554/live/chn0 RTSP/1.0
CSeq: 3
User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)
Accept: application/sdp
服务器给客户端返回SDP信息;下面SDP信息"m=video 0 RTP/AVP 96"包含了视频的传输发方式为"RTP/AVP",RTP中对应的载荷类型值为96,"a=rtpmap:96 H264/90000"表示视频编码为H264视频为90000HZ。"m=audio 0 RTP/AVP 97"表示音频的传输类型为"RTP/AVP",音频在RTP中的载荷类型值为97;"a=rtpmap:97 mpeg4-generic/32000/2"表示音频编码是AAC,采样率32000,双声道。
RTSP/1.0 200 OK
CSeq: 3
Date: Sat Dec 3 15:25:30 2022
Transport: RTP/AVP
Accept: application/sdp
Server: rtspServer
Content-Type: application/sdp
Content-Length: 471
v=0
o=- 0 0 IN IP4 0.0.0.0
s=h265+aac
t=0 0
a=control:rtsp://127.0.0.1:554/live/chn0
a=range:npt=0-
m=video 0 RTP/AVP 98
c=IN IP4 0.0.0.0
a=rtpmap:98 H265/90000
a=control:rtsp://127.0.0.1:554/live/chn0/track1
m=audio 0 RTP/AVP 97
c=IN IP4 0.0.0.0
a=rtpmap:97 mpeg4-generic/44100/2
a=fmtp:97 streamtype=5;profile-level-id=1;sizeLength=13;IndexLength=3;indexDeltaLength=3;mode=AAC-hbr;config=2210;
a=control:rtsp://127.0.0.1:554/live/chn0/track2
SETUP交互信令如下:
客户端往服务器发送请求;客户端通过Transport自动信息告诉服务器,通过UDP(RTP/AVP)的方式传递流媒体(RTP封包后)的数据,采用单播方式(unicast),client_port约定的是客户端RTP和RTCP数据的端口号,通常RTP的端口为偶数,RTCP的端口号为RTP的端口加1,端口号范围通常为1024 - 65535。
SETUP rtsp://127.0.0.1:554/live/chn0/track1 RTSP/1.0
CSeq: 4
User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)
Transport: RTP/AVP;unicast;client_port=63732-63733
服务器给客户端返回信息;server_port是服务器的RTP/RTCP的端口号;ssrc是RTP封装包过程的ssrc值。Session字段是当前会话ID。
RTSP/1.0 200 OK
CSeq: 4
Date: Sat Dec 3 14:22:42 2022
session: 305419896
Transport: RTP/AVP;ssrc=22345678;unicast;client_port=63734-63735;server_port=49154-49155
Server: rtspServer
PLAY交互信令如下:
客户端往服务器发送请求;Range字段包含了播放流的范围比如网络时间协议(npt)0s时间开始到100s结束;如果是实时流通常配置0-,表示播放流表不会自动停止,下面的“Range: npt=0.000-”通常用于实时直播流的播放。
PLAY rtsp://127.0.0.15:554/live/chn0 RTSP/1.0
CSeq: 5
User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)
Session: 305419896
Range: npt=0.000-
服务器给客户端返回信息;
RTSP/1.0 200 OK
CSeq: 5
Date: Sat Dec 3 14:22:42 2022
session: 810817929
Server: rtspServer
TEARDOWN交互信令如下:
客户端往服务器发送请求;客户端通过Session告诉服务器应该关闭哪个RTSP会话。
TEARDOWN rtsp://127.0.0.1:554/live/chn0 RTSP/1.0
CSeq: 6
User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)
Session: 305419896
服务器给客户端返回信息;
RTSP/1.0 200 OK
CSeq: 6
单播实时模式下的RTSP 服务端的设计框图如下(RTP的传输没有RTCP)。在启动RTSP Server过程先配置网络(socket的创建、等待连接等);然后分别创建RTSP Server Task和RTSP Transport Task。
RTSP Server Task用于连接新的客户端并完成信令交互。当新的客户端连接进来会加入到客户端连接List中,然后解析客户端发来的信令消息;若客户端的信令消息有错或者客户端发了TEARDOWN 的方法则将该客户端从客户端连接List中移除。 RTSP Server Task在信令交互过程会确认RTP传输的方式、端口号等参数。
RTSP Transport Task 用于RTP封包并将RTP包发送给连接进来的每一个客户端。当客户端发送PLAY方法则将该客户端加入到RTP传输List中;打包完成RTP数据后从RTP传输List中遍历客户端,并根据RTP传输方式(UDP/TCP)来传输RTP数据包。
单播实时模式下的RTSP客户端的设计框图如下(RTP的传输没有RTCP)。在启动RTSP 客户端过程先配置网络(socket的创建、连接等);然后分别创建RTSP Client Task和RTSP Recv Task。
RTSP Client Task 用于和服务建立连接信令交互。在RTSP Client会告知服务器发送RTP包的方式是UDP还是TCP,以及RTP的端口号。
RTSP RecvTask用于接收RTP包并将RTP包解封装,生成原始的H264/265、AAC编码数据,并将原始的H264/265、AAC编码数据存储到缓存队列中。
SDP(Session Description Protocol)相关资料:RFC 2327: SDP: Session Description Protocol;RTP协议相关资料:RFC 3550: RTP: A Transport Protocol for Real-Time Applications
RTSP服务器代码实现请参考
RTSP客户端代码实现请参考