RTSP (Real-Time Streaming Protocol)
rfc2326
1概念
1.1 RTSP目的
RTSP建立并控制一个或几个时间同步的连续流媒体。
RTSP本身通常并不发送连续媒体流。
RTSP充当多媒体服务器的网络远程控制。
1.2 RTSP会话
每次服务由服务器端保持一个代标签的会话。
1.3 RTSP状态
SETUP 让服务器给流分配资源,启动RTSP会话。
PLAY与RECORD 启动SETUP分配流的数据传输。
PAUSE 临时停止流,而不释放服务器资源。
TEARDOWN 释放流的资源,RTSP会话停止。
1.4 RTSP标识
会议标识
conference-id = 1*xchar
会话标识
session-id = 1*( ALPHA | DIGIT | safe )
1.5 RTSP时间
SMPTE相对时间戳
SMPTE表示相对于开始剪辑的时间。
正常播放时间
NPT指出了流相对于表示开始时的绝对位置。
绝对时间
绝对时间表示为ISO 8601时间戳,使用UTC(GMT)小数法表示。
2 RTSP消息
RTSP是基于文本的协议,采用ISO 10646字符集,使用UTF-8编码方案。行以CRLF中断,但接收者本身可将CR和LF解释成行终止符。
2.1 RTSP消息的组成
RTSP消息由客户端到服务器的请求和由服务器到客户端的回应组成。
RTSP-message = Request | Response
请求和回应都可能包括一个起始行,一个或多个标题域,一行表示标题域结束的空格和一个消息主体。
generic-message = start-line
*message-header
CRLF
[ message-body ]
2.2 起始行start-line
start-line = Request-Line | Status-Line
2.3 标题域RTSP-header
2.3.1 RTSP-header的种类
RTSP标题域,包括主标题(General-Header)、请求标题(Request-Header)、回应标题(Response-Header)及实体标题(Entity-Header)。
RTSP-header = field-name ":" [ field-value ] CRLF
field-name = token
field-value = *( field-content | LWS )
field-content = and consisting of either *TEXT or combinations
of token, tspecials, and quoted-string>
2.3.2 普通标题域
General-Header = Date
| Pragma
2.3.3 标题域定义Header Field Definitions
RTSP标题域小结如下:
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 ;RTP信息
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 ;WWW-授权
2.4 消息主体message-body
message-body = entity-body
|
2.5 消息长度
3 RTSP请求
3.1 RTSP请求的组成
Request = Request-Line
*( general-header
| request-header
| entity-header )
CRLF
[ message-body ]
3.2 请求队列Request-Line
Request-Line = Method SP Request-URI SP RTSP-Version CRLF
3.2.1 RTSP方法
Method = "DESCRIBE"
| "ANNOUNCE"
| "GET_PARAMETER"
| "OPTIONS"
| "PAUSE"
| "PLAY"
| "RECORD"
| "REDIRECT"
| "SETUP"
| "SET_PARAMETER"
| "TEARDOWN"
| extension-method
extension-method = token
方法定义(method token)表示了对请求统一资源标志符(Request-URI)识别的资源所执行的操作。
RTSP方法小结如下:
method direction object requirement
DESCRIBE C -> S P,S recommended
ANNOUNCE C -> S, S ->C P,S optional
GET PARAMETER C -> S, S ->C P,S optional
OPTIONS C -> S, S ->C P,S required
(S -> C: optional)
PAUSE C -> S P,S recommended
PLAY C -> S P,S required
RECORD C -> S P,S optional
REDIRECT S -> C P,S optional
SETUP C -> S S required
SET PARAMETER C -> S, S ->C P,S optional
TEARDOWN C -> S P,S required
3.2.1.1 OPTIONS
OPTIONS请求可能在任何时候发出,并且不影响服务器状态。
3.2.1.2 DESCRIBE
DESCRIBE方法从服务器检索表示的描述或媒体对象,这些资源通过请求统一资源定位符(the request URL)识别。
3.2.1.3 ANNOUNCE
ANNOUNCE方法有两个用途:
当客户端向服务器发送时,ANNOUNCE将通过请求URL识别的表示描述或者媒体对象提交给服务器;
当服务器相客户端发送时,ANNOUNCE实时更新会话描述。
3.2.1.4 SETUP
SETUP请求为URI指定流式媒体的传输机制。
3.2.1.5 PLAY
PLAY方法告知服务器通过SETUP中指定的机制开始发送数据 。
3.2.1.6 PAUSE
PAUSE请求引起媒体流传输的暂时中断。
3.2.1.7 TEARDOWN
TEARDOWN请求终止了给定URI的媒体流传输,并释放了与该媒体流相关的资源。
3.2.1.8 GET PARAMETER
GET PARAMETER请求检索URI指定的表示或媒体流的参数值。
3.2.1.9 SET PARAMETER
SET PARAMETER方法给URI指定的表示或媒体流设置参数值。
3.2.1.10 REDIRECT
REDIRECT请求告知客户端连接到另一个服务器位置。
3.2.1.11 RECORD
RECORD方法根据表示描述开始记录媒体数据。
3.2.2 RTSP URL
Request-URI = "*" | absolute_URI
“rtsp”和“rtspu”表示要通过RTSP协议来定位网络资源。
rtsp_URL = ( "rtsp:" | "rtspu:" ) "//" host [ ":" port ] [ abs_path ]
host = <合法的Internet主机域名或IP地址(用十进制数及点组成)>
port = *DIGIT
例如:RTSP URL:
rtsp://media.example.com:554/twister/audiotrack
3.2.3 RTSP版本
RTSP-Version = "RTSP" "/" 1*DIGIT "." 1*DIGIT
如:RTSP/1.0。
3.3 请求标题域
request-header = Accept
| Accept-Encoding
| Accept-Language
| Authorization
| From
| If-Modified-Since
| Range
| Referer
| User-Agent
3.3.1 接受 Accept
接受请求报头区域可以同作详细说明特定对于响应来说可以接受的媒体形式。
例如:
Accept: application/rtsl, application/sdp;level=2
3.3.2 接受编码 Accept-Encoding
接收编码(Accept-Encoding)请求报头域和接收(Accept)相似,但限定响应中可接收的内容码(content-codings)。
3.3.3 接受语言 Accept-Language
接受语言(Accept-Language)请求报头区与认可是相近的,但规定了一套自然语言用来响应请求。
3.3.4 授权 Authorization
用户代理通过包括Authorization请求报头域的请求那样做。Authorization请求报头域的值由包含用户代理验证信息的信任状所组成,这些用户代理处于请求资源的领域。
3.3.5 来自 From
From请求报头域,如果给定的话,应该(SHOULD)包括控制请求用户代理的人的互联网E-MAIL地址。
3.3.6 从何时更改 If-Modified-Since
用一种方法使If-Modified-Since请求报头域被用来使得如果请求的变量自从这个域说明的时间以来没有被修改过,实体将不会从服务器返回;相反的,将返回304响应(没有修改的)而没有任何报文实体。
3.3.7 范围 Range
一个字节范围操作可以确定字节的单一范围,或一个单一实体里的一组范围。
3.3.8 提交方 Referer
参考者(Referer)请求头域允许客户确定获得请求URI的资源地址(URI)-为了服务器的利益。Referer请求头允许服务器生成关于到资源的反向连接(back-link)的列表,为了兴趣,记录,优化的高速缓存等等。它也允许追踪过时的或错误类型的连接(link)以便维护。如果请求URI是从一个没有自己的URI的源获得的,如从使用者键盘的输入,那么一定不要发送Referer域。
3.3.9 用户代理 User-Agent
用户代理请求头包括发出请求的用户代理的信息。
4 RTSP回应
4.1 RTSP回应的组成
Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
4.2 状态代码
状态代码的第一位数字定义了回应的类别,后面两位数字没有具体分类。首位数字有5种取值可能:
* 1xx: 保留,将来使用。
* 2xx: 成功 - 操作被接收、理解、接受(received,understood,accepted)。
* 3xx: 重定向(Redirection)- 要完成请求必须进行进一步操作。
* 4xx: 客户端出错 - 请求有语法错误或无法实现。
* 5xx: 服务器端出错 - 服务器无法实现合法的请求。
Status-Code = "100" ; Continue 继续
| "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 使用代理
| "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 请求URI过长
| "415" ; Unsupported Media Type 媒体类型不支持
| "451" ; Parameter Not Understood 参数不能理解
| "452" ; Conference Not Found 会议未找到
| "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 RTSP版本不支持
| "551" ; Option not supported 选择不支持
| extension-code
extension-code = 3DIGIT
4.3 原因表示
Reason-Phrase = *
4.4 回应标题域
response-header = Location
| Proxy-Authenticate
| Public
| Retry-After
| Server
| Vary
| WWW-Authenticate
4.4.1 位置 Location
除了应用于关于请求完成或新资源确认的请求,URI位置响应报头域还用于使收件人重发到某个地址。对201(Created)响应,位置是请求建立的新资源。对3xx响应.Location应当指出服务器的关于资源自动重定向的首选URI。该域的值由单个绝对的URI组成。
Location = "Location" ":" absoluteURI
4.4.2 代理授权 Proxy-Authenticate
代理认证的响应头域必须是407响应的一部分。这个域的值由表示认证方案的复杂问题和应用于这个请求URI的代理的参数组成。
Proxy-Authenticate = "Proxy-Authenticate" ":" 1#challenge
4.4.3 公用性 Public
4.4.4 稍后再试 Retry-After
4.4.5 服务器 Server
4.4.6 变化 Vary
更正头域是在响应开始的时候变更完全接收的请求头域设置,而不管高速缓存是否允许用响应回复后续的请求。对于非高速缓存或者旧的响应,更正头域值建议用户代理用来选择请求的标准。
一个为“*”的更正域意味着高速缓存不能根据后来的请求的请求头判断而不管这个请求是否是恰当请求。
Vary = "Vary" ":" ( "*" | 1#field-name )
4.4.7 WWW-授权 WWW-Authenticate
5 RTSP实体
5.1 实体标题域
entity-header = Allow
| Content-Base
| Content-Encoding
| Content-Language
| Content-Length
| Content-Location
| Content-Type
| Expires
| Last-Modified
| extension-header
extension-header = message-header
5.1.1 允许 Allow
例如:
Allow: SETUP, PLAY, RECORD, SET_PARAMETER
5.1.2 基本内容 Content-Base
5.1.3 内容编码 Content-Encoding
内容编码值表示一种已经或可以应用于实体的编码变换。内容编码主要用来允许文档压缩,换句话说,有效的变换而不损失它的基本媒体类型的特性,也不丢失信息。经常地,实体以编码形式储存,直接传送,只能由接收者译码。
content-coding = token
5.1.4 内容语言 Content-Language
内容语言实体报头域描述了实体面向的受众的使用语言。请注意,这不一定等同于实体正文中用到的所有语言。
Content-Language = "实体语言"":"1#语言标记
5.1.5 内容长度 Content-Length
内容长度实体报头域按十进制或八位字节数指明了发给接收者的实体正文的大小,或是在使用HEAD方法的情况下,指明若请求为GET时将发送实体正文的大小。
Content-Length = "内容长度"":"1*DIGIT
5.1.6 内容位置 Content-Location
内容位置(Content-Location)可用来在从一独立于请求资源的URI的位置访问实体时提供报文中实体的资源位置。服务器应根据应答实体为此变量提供一内容位置;尤其是在资源和多个实体相联系,而这些实体各享独立位置,可被分别访问时,服务器应为特定的返回变量提供内容位置。
Content-Location="内容位置"":"(绝对URI|相对URI)
5.1.7 内容类型 Content-Type
内容类型实体报头域指明发给接收者的实体正文的媒体类型,或在HEAD方法中指明若请求为GET时将发送的媒体类型。
Content-Type = "内容-类型"":"媒体类型
5.1.8 过期 Expires
"过期"实体报头域给出了在何日何时之后应答即被视为陈旧。除非首先经原服务器(或含有此实体较新拷贝的中介代理服务器缓存)确认为有效,缓存一般不会返回陈旧的缓存目录值。
其格式为由HTTP-日期定义的绝对日期与时间; 它必须遵照RFC 1123的日期格式:
过期="过期"":" HTTP-日期
5.1.9 最近更改 Last-Modified
5.2 实体主体
Entity-Body = *OCTET
6 连接
RTSP请求可以几种不同方式传送:
1.持久传输连接,用于多个请求/回应传输。
2.每个请求/回应传输一个连接。
3.无连接模式。
7 实例分析
Request: SETUP rtsp://192.168.0.166/stone.ts/track1 RTSP/1.0\r\n
CSeq: 5\r\n
Transport: RTP/AVP;unicast;client_port=41658-41659
User-Agent: VLC media player (LIVE555 Streaming Media v2008.07.24)\r\n
\r\n
Response: RTSP/1.0 200 OK\r\n
Server: VSS/0.4.0 (Build/242; Platform/Linux; Release/Video Streaming Server)\r\n
Cseq: 5\r\n
Session: 2174075922979178184
Date: Thu, 03 Sep 2009 07:31:23 GMT\r\n
Expires: Thu, 03 Sep 2009 07:31:23 GMT\r\n
Transport: RTP/AVP;unicast;source=192.168.0.166;client_port=41658-41659;server_port=6970-6971;ssrc=459ABBF5
\r\n
阅读(1859) | 评论(0) | 转发(2) |