RTSP出现之前,最热的大概就是HTTP协议。想象一下,当你需要欣赏网络中的某一段视频,通过HTTP协议访问其URL、开始下载、下载完成之后播放。对于早期的视频采集设备、网络带宽或是负责渲染的显示器而言,似乎多给予一点耐心、多重连几次断开的HTTP连接、甚至多校验几次下载后文件的完整性,体验上也还能过得去。毕竟那时候的分辨率、帧率、带宽限制了互联网途径传播媒体文件的大小,信息的分享只能通过各种硬盘、U盘、光盘以存储后文件的形式进行传输。
随着硬件设备技术的发展,采集设备分辨率在提升,显示器支持了更高的帧率,网络带宽也指数增长,这都为更好的观影体验提供了基础支持。随着网络资源的日益丰富,用户时间的稀缺性日益凸显,为了快速观看、判别视讯本身是否符合自身口味,在线实时观看成了一大诉求。而传统的HTTP下载显然不能够完全匹配该需求,因此在寻求streaming的道路上,RTSP脱颖而出。
RTSP全程实时流协议(Real Time Streaming Protocol),它是一个网络控制协议,设计用于娱乐、会议系统中控制流媒体服务器。RTSP用于在希望通讯的两端建立并控制媒体会话(session),客户端通过发出VCR-style命令如play、record和pause等来实时控制媒体流。
RTSP(Real Time Streaming Protocol 实时流协议)建立并控制一个或几个时间同步的连续流媒体,对媒体流提供了诸如开始、暂停、快进、停止等控制,RTSP的作用相当于流媒体服务器的远程控制,而它本身并不传输数据。对应文档: RFC 2326 - Real Time Streaming Protocol (RTSP)
几个特点:
从上述架构图中可以看出,RTSP和RTP,RTCP配合使用。RTSP传输的一般是TS、MP4格式的流,其传输一般需要2~3个通道,命令和数据通道分离。使用RTSP协议传输流媒体数据需要有专门的媒体播放器和媒体服务器,也就是需要支持RTSP协议的客户端和服务器*。
RTSP协议定义了一对多程序如何有效的通过IP网络传输多媒体数据。RTSP在体系结构上位于RTP和RTCP上,它使用TCP或者RTP完成数据传输。RTSP被用于建立控制媒体流的传输,它为多媒体服务扮演“网络远程控制”的角色。尽管有时候可以把RTSP控制信息和媒体数据流交织在一起传输,但一般情况下RTSP本身并不用于传送媒体流数据。媒体数据的传输可以通过RTP/RTCP等协议来完成
RTSP是类似http的应用层协议,一个典型的流媒体框架网络体系可参考下图
总的来说:
RTSP承载与RTP和RTCP之上,RTSP并不会发送媒体数据,而是使用RTP协议传输
RTP并没有规定发送方式,可以选择udp发送或者tcp发送
RTSP的语法和运作跟HTTP 1.0类似,但并不特别强调时间同步,所以比较能够容忍网络延迟。
RTSP具有重新导向功能,可以根据实际负载情况来转换提供服务的服务器,以避免过大的负载集中与同一服务器而造成时延。
RTSP协议与HTTP协议的语法非常类似,且都是纯文本协议,但它们也有区别:
RTSP的有很多优点:
RTSP常用的方法包括:OPTIONS、DESCRIBE、ANNOUNCE、SETUP、TEARDOWN、PLAY、PAUSE、GET_PARAMETER和SET_PARAMETER等。
详细使用介绍如下:
一个基本的RTSP操作过程:
客户端->>服务器:DESCRIBE
服务器->>客户端: 200 OK (SDP)
客户端->>服务器:SETUP
服务器->>客户端: 200 OK
客户端->>服务器:PLAY
服务器->>客户端: (RTP包)
RTSP有两类报文:请求报文和响应报文。
RTSP协议格式与HTTP协议格式类似,也由三部分组成,即开始行、首部行和实体主体。
在请求报文中,开始行就是请求行,RTSP请求报文的结构如下图所示:
method url vesion\r\n
CSeq: x\r\n
xxx\r\n
...
\r\n
下面是SETUP请求消息的一个Wireshark抓包,我们以此为例进行报文解析:
从上图的抓包可以明显看出,RTSP的第一行(请求行)的内容包括:方法名称(SETUP) + 空格 + URL地址 + 空格 + RTSP版本 + 回车符(CR)和换行符(LF)
第二、第三、第四行表示的是该消息的各字段名称及其对应的值:字段名 + 空格 + 字段值 + 回车符(CR)和换行符(LF)
最后一行则直接为回车符(CR)和换行符(LF),表示本次请求报文结束
一个终端用户是通过在播放器中输入URL地址开始进行观看流媒体业务的第一步,而对于使用RTSP协议的移动流媒体点播而言,URL的一般写法如下:
一个以“rtsp”或是“rtspu”开始的URL链接用于指定当前使用的是RTSP 协议。RTSP URL的语法结构如下:
rtsp_url = (”rtsp:” | ”rtspu:” | ”rtsps:”) “//” host [“:”port”] /[abs_path]/content_name
例如,一个完整的RTSP URL可写为:
rtsp://192.168.1.67:554/test
又如目前市面上常用的海康网络摄像头的RTSP地址格式为:
rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
示例
rtsp://admin:[email protected]:554/h264/ch1/main/av_stream
另一个简单的示例如下:
rtsp://media.example.com:554/twister/audiotrack
让我们来看一下上面URL的abs path = twister/audiotrack。twister表示一个标识(Presentation) ,标识(Presentation)由一个或多个实时流组成。audiotrack表示标识(Presentation)中其中一个实时流的名称。从这个名称可以看出,我们要取的是一个音频流。如果abs path = twister/videotrack,则表示我们要取的是twister的视频流。
有的服务器也支持下面的URL形式:
rtsp://media.example.com:554/twister
该URL表示取标识(Presentation)的视频流和音频流。
每一个请求发出后,都能收到一个响应。响应报文的开始行是状态行,RTSP响应报文的结构如下图所示:
rtsp-vesion 200 OK\r\n
CSeq: x\r\n
xxx\r\n
...
\r\n
下面是SETUP响应消息的一个Wireshark抓包,我们以此为例进行报文解析:
从上面的抓包可以看出,RTSP的第一行(状态行)的内容包括:
RTSP版本 + 空格 + 状态码 + 空格 + 状态语 + 回车符(CR)和换行符(LF)
第二、第三、第四、第五行表示的是该消息的各字段名称及其对应的值:
字段名(CSeq:) + 空格 + 字段值 + 回车符(CR)和换行符(LF)
最后一行则也直接为回车符(CR)和换行符(LF),表示报文结束
第1步:OPTIONS
OPTIONS rtsp://192.168.31.115:8554/live RTSP/1.0\r\n
CSeq: 2\r\n
\r\n
RTSP/1.0 200 OK\r\n
CSeq: 2\r\n
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY\r\n
\r\n
第2步:DESCRIBE
DESCRIBE rtsp://192.168.31.115:8554/live RTSP/1.0\r\n
CSeq: 3\r\n
Accept: application/sdp\r\n
\r\n
RTSP/1.0 200 OK\r\n
CSeq: 3\r\n
Content-length: 146\r\n
Content-type: application/sdp\r\n
\r\n
v=0\r\n
o=- 91565340853 1 in IP4 192.168.31.115\r\n
t=0 0\r\n
a=contol:*\r\n
m=video 0 RTP/AVP 96\r\n
a=rtpmap:96 H264/90000\r\n
a=framerate:25\r\n
a=control:track0\r\n
第3步:SETUP
Transport: RTP/AVP;unicast;client_port=54492-54493\r\n
SETUP rtsp://192.168.31.115:8554/live/track0 RTSP/1.0\r\n
CSeq: 4\r\n
Transport: RTP/AVP;unicast;client_port=54492-54493\r\n
\r\n
RTSP/1.0 200 OK\r\n
CSeq: 4\r\n
Transport: RTP/AVP;unicast;client_port=54492-54493;server_port=56400-56401\r\n
Session: 66334873\r\n
\r\n
第4步:PLAY
PLAY rtsp://192.168.31.115:8554/live RTSP/1.0\r\n
CSeq: 5\r\n
Session: 66334873\r\n
Range: npt=0.000-\r\n
\r\n
RTSP/1.0 200 OK\r\n
CSeq: 5\r\n
Range: npt=0.000-\r\n
Session: 66334873; timeout=60\r\n
\r\n
第5步:S->C:发送流媒体数据
第6步:S:TEARDOWN
TEARDOWN rtsp://192.168.31.115:8554/live RTSP/1.0\r\n
CSeq: 6\r\n
Session: 66334873\r\n
\r\n
RTSP/1.0 200 OK\r\n
CSeq: 6\r\n
\r\n
上述的过程是标准的、友好的rtsp流程,但实际的需求中并不一定按部就班来。
其中第3和4步是必需的!只要服务器客户端约定好,有哪些方法可用,则option请求可以不要。第2步,如果我们有其他途径得到媒体初始化描述信息(比如http请求等等),则我们也不需要通过rtsp中的describe请求来完成。第5步,可以根据系统需求的设计来决定是否需要。
RTSP的响应内容通常包含3位整数响应码以及一个原因短语,短语的目的是给出状态代码的简短文本描述, 客户端不需要检查或显示原因短语。 按照响应码的首位数字区别,可以分为以下五个类别:
当然,RTSP的错误码和RTSP方法是强相关的,某些错误可能只会在特定方法中才会触发,详细错误码信息如下: