一、 概述
RTSP(Real Time Streaming Protocol),实时流传输协议, 是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学网景和RealNetworks公司提交的IETF RFC标准,该协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据,RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或RTP完成数据传输。
RTSP提供了一个可扩展框架,使实时数据,如音频与视频的受控点播成为可能,数据源包括现场数据与存储在剪辑中数据,该协议目的在于控制多个数据发送连接,为选择发送通道,如UDP,组播UDP与TCP,提供途径,并为选择基于RTP上发送机制提供方法。
它的语法和运作跟HTTP 1.1类似,但并不特别强调时间同步,所以比较能容忍网络延迟。
HTTP与RTSP相比,HTTP传送HTML,HTTP请求由客户机发出,服务器作出响应 ,RTSP传送的是多媒体数据,使用RTSP时,客户机和服务器都可以发出请求,即RTSP可以是双向的。
RTSP是用来控制声音或影像的多媒体串流协议,并允许同时多个串流需求控制,传输时所用的网络通讯协议并不在其定义的范围内,服务器端可以自行选择使用TCP或UDP来传送串流内容。
而前面提到的允许同时多个串流需求控制(Multicast),除了可以降低服务器端的网络用量,更进而支持多方视讯会议(Video Conference),因为与HTTP1.1的运作方式相似,所以代理服务器〈Proxy〉的快取功能〈Cache〉也同样适用于RTSP,并因RTSP具有重新导向功能,可视实际负载情况来转换提供服务的服务器,以避免过大的负载集中于同一服务器而造成延迟。
该协议用于C/S模型,是一个基于文本的协议,用于在客户端和服务器端建立和协商实时流会话。
实时流协议(RTSP)建立并控制一个或几个时间同步的连续流媒体,尽管连续媒体流与控制流交换是可能的,通常它本身并不发送连续流,换言之,RTSP充当多媒体服务器的网络远程控制。RTSP连接没有绑定到传输层连接,如TCP.在RTSP连接期间,RTSP用户可打开或关闭多个对服务器的可传输连接以发出RTSP请求。此外,可使用无连接传输协议,如UDP。RTSP流控制的流可能用到RTP,但RTSP操作并不依赖用于携带连续媒体的传输机制。
协议支持的操作如下:
(1)从媒体服务器上检索媒体: 用户可通过HTTP或其它方法提交一个演示描述,如演示是组播,演示式就包含用于连续媒体的的组播地址和端口。如演示仅通过单播发送给用户,用户为了安全应提供目的地址。
(2)媒体服务器邀请进入会议:媒体服务器可被邀请参加正进行的会议,或回放媒体,或记录其中一部分,或全部。这种模式在分布式教育应用上很有用,会议中几方可轮流按远程控制按钮。
(3)将媒体加到现成讲座中:如服务器告诉用户可获得附加媒体内容,对现场讲座显得尤其有用,如HTTP/1.1中类似,RTSP请求可由代理,通道与缓存处理。
- 可扩展性:新方法和参数很容易加入RTSP.
- 易解析: RTSP可由标准HTTP或MIME解析器解析.
- 安全: RTSP使用网页安全机制.
- 独立于传输: RTSP可使用不可靠数据报协议(EDP),可靠数据报协议(RDP);如要实现应用级可靠,可使用可靠流协议.
- 多服务器支持:每个流可放在不同服务器上,用户端自动与不同服务器建立几个并发控制连接,媒体同步在传输层执行.
- 记录设备控制:协议可控制记录和回放设备.
- 流控与会议开始分离:仅要求会议初始化协议提供,或可用来创建惟一会议标识号.特殊情况下,可用SIP或H.323来邀请服务器入会.
- 适合专业应用:通过SMPTE时标, RTSP支持帧级精度,允许远程数字编辑.
- 演示描述中立:协议没强加特殊演示或元文件,可传送所用格式类型;然而,演示描述至少必须包括一个RTSP URL.
- 代理与防火墙友好:协议可由应用和传输层防火墙处理.防火墙需要理解SETUP方法,为UDP媒体流打开一个“缺口”.
- HTTP友好:此处, RTSP明智地采用HTTP观念,使现在结构都可重用.结构包括Internet内容选择平台(PICS).由于在大多数情况下控制连续媒体需要服务器状态, RTSP不仅仅向HTFP添加方法.
- 适当的服务器控制:如用户启动一个流,必须也可以停止一个流.
- 传输协调:实际处理连续媒体流前,用户可协调传输方法.
- 性能协调:如基本特征无效,必须有一些清理机制让用户决定哪种方法没生效.这允许用户提出适合的用户界面.
二、协议解析
C表示rtsp客户端, S表示rtsp服务端
1、OPTION
C->S:OPTION request //询问S有哪些方法可用
S->C:OPTION response //S回应信息中包括提供的所有可用方法
2、DESCRIBE
C->S:DESCRIBE request //要求得到S提供的媒体初始化描述信息
S->C:DESCRIBE response //S回应媒体初始化描述信息, 主要是sdp
3、SETUP
C->S:SETUP request //设置会话的属性, 以及传输模式, 提醒S建立会话
S->C:SETUP response //S建立会话, 返回会话标识符, 以及会话相关信息
4、PLAY
C->S:PLAY request //C请求播放
S->C:PLAY response //S回应该请求的信息
5、TEARDOWN
C->S:TEARDOWN request //C请求关闭会话
S->C:TEARDOWN response //S回应该请求
上述的过程是标准的,友好的rtsp流程,但实际的需求中并不一定按部就班来,其中第3和4步是必需的!
第一步,只要服务器客户端约定好,有哪些方法可用,则option请求可以不要。
第二步,如果我们有其他途径得到媒体初始化描述信息(比如http请求等等),则我们也不需要通过rtsp中的describe请求来完成。
第五步,可以根据系统需求的设计来决定是否需要。
RTSP的消息有两大类: 请求消息(request), 回应消息(response).
请求消息
方法 URI RTSP版本 CR LF
消息头 CR LF
CR LF
消息体 CR LF
其中方法包括OPTION回应中所有的命令,URI是接受方的地址,例如:rtsp://192.168.20.136. RTSP版本一般都是RTSP/1.0。每行后面的CR LF表示回车换行,需要接受端有相应的解析,最后一个消息头需要有两个CR LF(即空行)。
回应消息
RTSP版本 状态码 解释 CR LF
消息头 CR LF
CR LF
消息体 CR LF
其中RTSP版本一般都是RTSP/1.0,状态码是一个数值, 200表示成功,解释是与状态码对应的文本解释.
消息头的定义如下表. 表格说明:
- Type:
- 类型 "g" 表示请求和响应中的通用请求头;
- 类型 "R" 表示请求头;
- 类型 "r" 表示响应头;
- 类型 "e" 表示实体头字段.
- Support:
- "req." 表示必须由接收者以特殊的方法实现; 注意, 不是所有 "req." 字段在该类型的每个请求中都会被发送. "req." 只表示客户机(支持响应头)和服务器(支持请求头)必须执行该字段.
- "opt." 表示是可选的.
- 最后一栏列出了关于头字段产生作用的方法; 其中 "entity" 针对于返回一个信息主体的所有方法. )
| Header | Type | Support | Methods | |--------------------|------|---------|---------------------------| | Accept | R | opt. | entity | | Accept-Encoding | R | opt. | entity | | Accept-Language | R | opt. | all | | Allow | R | opt. | all | | Authorization | R | opt. | all | | Bandwidth | R | opt. | all | | Blocksize | R | opt. | All but OPTIONS, TEARDOWN | | Cache-Control | G | opt. | SETUP | | Conference | R | opt. | SETUP | | Connection | G | req. | all | | Content-Base | E | opt. | entity | | Content-Encoding | E | req. | SET_PARAMETER | | Content-Encoding | E | req. | DESCRIBE, ANNOUNCE | | Content-Language | E | req. | DESCRIBE, ANNOUNCE | | Content-Length | E | req. | SET_PARAMETER, ANNOUNCE | | Content-Length | E | req. | entity | | Content-Location | E | opt. | entity | | Content-Type | E | req. | SET_PARAMETER, ANNOUNCE | | Content-Type | R | req. | entity | | CSeq | G | req. | all | | Date | G | opt. | all | | Expires | E | opt. | DESCRIBE, ANNOUNCE | | From | R | opt. | all | | If-Modified-Since | R | opt. | DESCRIBE, SETUP | | Last-Modified | E | opt. | entity | | Proxy-Authenticate | | | | | Proxy-Require | R | req. | all | | Public | R | opt. | all | | Range | R | opt. | PLAY, PAUSE, RECORD | | Range | R | opt. | PLAY, PAUSE, RECORD | | Referer | R | opt. | all | | Require | R | req. | all | | Retry-After | R | opt. | all | | RTP-Info | R | req. | PLAY | | Scale | Rr | opt. | PLAY, RECORD | | Session | Rr | req. | All but SETUP, OPTIONS | | Server | R | opt. | all | | Speed | Rr | opt. | PLAY | | Transport | Rr | req. | SETUP | | Unsupported | R | req. | all | | User-Agent | R | opt. | all | | Via | G | opt. | all | | WWW-Authenticate | R | opt. | all |
常用头解析:
Header: Description
CSeq: 命令的序列号, 逐1增加 ;
Content-Length :这个标记的存在说明后面有实体数据, 而且给出了这个数据块的大小, 单位是byte;
X-Playlist-Gen-Id :用来检查播放列表是否有效. 这个标记最初在客户端发送DESCRIBE命令后使用. 客户端在发送“SETUP”命令给服务器时必须回应一样的值;
X-Playlist-Seek-Id:值必须和X-Playlist-Gen-Id 域的值相同, 在PLAY请求命令中使用;
Blocksize:媒体包的总长度,单位是byte ;
Session:Session ID是用作客户端和服务器之间是否是正确的连接。在客户端发送SETUP命令后,服务器会在应答消息头里面发送一个session值给客户端。这算建立的一个会话;
X-Accept-Authentication:允许的authentication 方法. NTLM, Digest 和 Basic 是标准的 ;
X-Broadcast-Id :是否是实况或者是先期录制的流。0 表示先期录制,其他的值表示是实况;
Range:暂无中文释义 ;
Speed:用来调整传输到客户端的流得速度。假如你的带宽可以接受更高速的数据传送,这个域的值可以设置大于1来加速下载数据. i.e. x1 rate;
Server:服务器类型和软件版本;
EOF:文件结束标记,也是流的结束标记 ;
Date:日期时间,下面举个例子:Tue, 18 Nov 2003 15:57:07 GMT ;
Bandwidth:流需要的最大带宽,bits/秒;
Transport:使用什么协议来传输数据,比如TCP或者UDP等;
Etag:实体标记Entity tag,是一个分配给会话的值,就像”23180160″;
Supported:支持的COM modules , 有的是可选的;
Content-Type:此域用来表示命令或者应答的用意. 下面是常用的几种类型:
1、application/x-wms-Logconnectstats这个在SET_PARAMETER命令中用到,表示将客户端的信息登记到服务器上;
2、application/sdp这个表示接下来数据包里面的是sdp数据,它是在服务器对DESCRIBE命令的应答包中;
3、application/x-wms-contentdesc表示紧跟的数据是一个内容描述对象,它设置the layout of the dialog;
4、application/vnd.ms.wms-hdr.asfv1表示跟着一个流媒体头信息(ASF header),可以用BASIC 或者DIGEST来解码;
5、application/x-rtsp-packetpair它被用来确定连接的可用带宽; |
2.4 状态码
标准RTSP 消息的状态码(在应答消息的第一行表示)
| value | meaning | |-------|-------------------------------------| | ”100” | Continue (all 100 range) | | “200” | OK | | ”201” | Created | | ”250” | Low on Storage Space | | ”300” | Multiple Choices | | ”301” | Moved Permanently | | ”302” | Moved Temporarily | | ”303” | See Other | | ”304” | Not Modified | | ”305” | Use Proxy | | ”350” | Going Away | | ”351” | Load Balancing | | ”400” | Bad Request | | ”401” | Unauthorized | | ”402” | Payment Required | | ”403” | Forbidden | | ”404” | Not Found | | ”405” | Method Not Allowed | | ”406” | Not Acceptable | | ”407” | Proxy Authentication Required | | ”408” | Request Time-out | | ”410” | Gone | | ”411” | Length Required | | ”412” | Precondition Failed | | ”413” | Request Entity Too Large | | ”414” | Request-URI Too Large | | ”415” | Unsupported Media Type | | ”451” | Parameter Not Understood | | ”452” | reserved | | ”453” | Not Enough Bandwidth | | ”454” | Session Not Found | | ”455” | Method Not Valid in This State | | ”456” | Header Field Not Valid for Resource | | ”457” | Invalid Range | | ”458” | Parameter Is Read-Only | | ”459” | Aggregate operation not allowed | | ”460” | Only aggregate operation allowed | | ”461” | Unsupported transport | | ”462” | Destination unreachable | | ”500” | Internal Server Error | | ”501” | Not Implemented | | ”502” | Bad Gateway | | ”503” | Service Unavailable | | ”504” | Gateway Time-out | | ”505” | RTSP Version not supported | | ”551” | Option not supported |
三、 rtsp中常用方法举例
本节针对上面所述的典型交互过程进行说明
1、OPTION
目的是得到服务器提供的可用方法:
OPTIONS rtsp://192.168.20.136:5000/xxx666 RTSP/1.0
CSeq: 1 //每个消息都有序号来标记, 第一个包通常是option请求消息
User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)
服务器的回应信息包括提供的一些方法,例如:
RTSP/1.0 200 OK
Server: UServer 0.9.7_rc1
Cseq: 1 //每个回应消息的cseq数值和请求消息的cseq相对应
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, SCALE,GET_PARAMETER //服务器提供的可用的方法
2、DESCRIBE
C向S发起DESCRIBE请求,为了得到会话描述信息(SDP):
DESCRIBE rtsp://192.168.20.136:5000/xxx666 RTSP/1.0
CSeq: 2
token:
Accept: application/sdp
User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)
服务器回应一些对此会话的描述信息(sdp):
RTSP/1.0 200 OK
Server: UServer 0.9.7_rc1
Cseq: 2
x-prev-url: rtsp://192.168.20.136:5000
x-next-url: rtsp://192.168.20.136:5000
x-Accept-Retransmit: our-retransmit
x-Accept-Dynamic-Rate: 1
Cache-Control: must-revalidate
Last-Modified: Fri, 10 Nov 2006 12:34:38 GMT
Date: Fri, 10 Nov 2006 12:34:38 GMT
Expires: Fri, 10 Nov 2006 12:34:38 GMT
Content-Base: rtsp://192.168.20.136:5000/xxx666/
Content-Length: 344
Content-Type: application/sdp
v=0 //以下都是sdp信息
o=OnewaveUServerNG 1451516402 1025358037 IN IP4 192.168.20.136
s=/xxx666
u=http:///
e=admin@
c=IN IP4 0.0.0.0
t=0 0
a=isma-compliance:1,1.0,1
a=range:npt=0-
m=video 0 RTP/AVP 96 //m表示媒体描述, 下面是对会话中视频通道的媒体描述
a=rtpmap:96 MP4V-ES/90000
a=fmtp:96 profile-level-id=245;config=000001B0F5000001B509000001000000012000C888B0E0E0FA62D089028307 a=control:trackID=0 //trackID=0表示视频流用的是通道0
3、SETUP
客户端提醒服务器建立会话,并确定传输模式:
SETUP rtsp://192.168.20.136:5000/xxx666/trackID=0 RTSP/1.0
CSeq: 3
Transport: RTP/AVP/TCP;unicast;interleaved=0-1
User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)
//uri中 带有trackID=0, 表示对该通道进行设置. Transport参数设置了传输模式, 包的结构. 接下来的数据包头部第二个字节位置就是 interleaved, 它的值是每个通道都不同的, trackID=0的interleaved值有两个0或1, 0表示rtp包, 1表示rtcp包, 接 受端根据interleaved的值来区别是哪种数据包.
服务器回应信息:
RTSP/1.0 200 OK
Server: UServer 0.9.7_rc1
Cseq: 3
Session: 6310936469860791894 //服务器回应的会话标识符
Cache-Control: no-cache
Transport: RTP/AVP/TCP;unicast;interleaved=0-1;ssrc=6B8B4567
4、PLAY
客户端发送播放请求:
PLAY rtsp://192.168.20.136:5000/xxx666 RTSP/1.0
CSeq: 4
Session: 6310936469860791894
Range: npt=0.000- //设置播放时间的范围
User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)
服务器回应信息:
RTSP/1.0 200 OK
Server: UServer 0.9.7_rc1
Cseq: 4
Session: 6310936469860791894
Range: npt=0.000000-
RTP-Info: url=trackID=0;seq=17040;rtptime=1467265309
//seq和rtptime都是rtp包中的信息
5、TEARDOWN
客户端发起关闭请求:
TEARDOWN rtsp://192.168.20.136:5000/xxx666 RTSP/1.0
CSeq: 5
Session: 6310936469860791894
User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)
服务器回应:
RTSP/1.0 200 OK
Server: UServer 0.9.7_rc1
Cseq: 5
Session: 6310936469860791894
Connection: Close
以上方法都是交互过程中最为常用的,其它还有一些重要的方法如get/set_parameter,pause,redirect等等