理解RTSP(Real Time Streaming Protocol)实时流协议
什么是协议?
接收到的数据,通过固定的方式封装后发送给他人,他人通过固定的方式解封装,便可获得需要的数据。此处涉及的固定封装和解封装方式就是一种协议。
协议是规则约束,这样可以理解,在不断的实践中协议会根据现有需求或是将有需求,不断的迭代升级。无论是谁,只要满足协议,就可以加入支持该协议的环境。
RTSP
实时流协议(Real Time Streaming Protocol,RTSP)是一种网络应用协议,专为娱乐和通信系统的使用,以控制流媒体服务器。该协议用于创建和控制终端之间的媒体会话。媒体服务器的客户端发布VCR命令,例如播放,录制和暂停,以便于实时控制从服务器到客户端(视频点播)或从客户端到服务器(语音录音)的媒体流。
方法定义
说明: 方向中(C 客户端 S 服务端) 对象中 (P 表示 S 媒体流)
方法 | 方向 | 对象 | 要求 |
---|---|---|---|
OPTIONS | C->S, S->C | P,S | 必选 (S->C: 可选) |
DESCRIBE | C->S | P,S | 推荐 |
ANNOUNCE | C->S, S->C | P,S | 可选 |
GET_PARAMETER | C->S, S->C | P,S | 可选 |
PAUSE | C->S | P,S | 推荐 |
PLAY | C->S | P,S | 必选 |
RECORD | C->S | P,S | 可选 |
REDIRECT | S->C | P,S | 可选 |
SETUP | C->S | S | 必选 |
SET_PARAMETER | C->S, S->C | P,S | 可选 |
TEARDOWN | C->S | P,S | 必选 |
-
1 OPTIONS
选项请求返回服务器可接受的请求类型C->S: OPTIONS * RTSP/1.0 CSeq: 1 Require: implicit-play Proxy-Require: gzipped-messages S->C: RTSP/1.0 200 OK CSeq: 1 Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE
-
2 DESCRIBE
描述方法检索演示文稿的描述或来自服务器的请求URL标识的媒体对象。 它可能会使用Accept标头,指定客户端支持的描述格式。 服务器响应所请求的描述资源。 DESCRIBE回复-响应构成了媒体RTSP的初始化阶段。媒体初始化是任何基于RTSP的系统的要求,但RTSP规范并没有规定必须通过DESCRIBE方法做。
RTSP客户端有三种方式初始化信息
- 通过RTSP的DESCRIBE方法;
- 通过一些其他协议(HTTP,电子邮件附件等);
- 通过命令行或标准输入(因此作为浏览器工作使用SDP文件或其他媒体启动的帮助应用程序初始化格式)。
为了实际的互操作性,是被强烈推荐实现。
C->S: DESCRIBE rtsp://server.example.com/fizzle/foo RTSP/1.0 CSeq: 312 Accept: application/sdp, application/rtsl, application/mheg S->C: RTSP/1.0 200 OK CSeq: 312 Date: 23 Jan 1997 15:35:06 GMT Content-Type: application/sdp Content-Length: 376 v=0 o=mhandley 2890844526 2890842807 IN IP4 126.16.64.4 s=SDP Seminar i=A Seminar on the session description protocol u=http://www.cs.ucl.ac.uk/staff/M.Handley/sdp.03.ps e=mjh@isi.edu (Mark Handley) c=IN IP4 224.2.17.12/127 t=2873397496 2873404696 a=recvonly m=audio 3456 RTP/AVP 0 m=video 2232 RTP/AVP 31 m=whiteboard 32416 UDP WB a=orient:portrait
-
3 ANNOUNCE
发布方法有两个目的:- 从客户端发送到服务器时,ANNOUNCE将请求URL标识的演示文稿或媒体对象的描述发布到服务器。当从服务器发送到客户端时,ANNOUNCE会实时更新会话描述。
- 如果新的媒体流被添加到演示文稿中(例如,在实时演示中),则应该再次发送整个演示文稿描述,而不仅仅是附加的组件,以便可以删除组件。
C->S: ANNOUNCE rtsp://server.example.com/fizzle/foo RTSP/1.0 CSeq: 312 Date: 23 Jan 1997 15:35:06 GMT Session: 47112344 Content-Type: application/sdp Content-Length: 332 v=0 o=mhandley 2890844526 2890845468 IN IP4 126.16.64.4 s=SDP Seminar i=A Seminar on the session description protocol u=http://www.cs.ucl.ac.uk/staff/M.Handley/sdp.03.ps e=mjh@isi.edu (Mark Handley) c=IN IP4 224.2.17.12/127 t=2873397496 2873404696 a=recvonly m=audio 3456 RTP/AVP 0 m=video 2232 RTP/AVP 31 S->C: RTSP/1.0 200 OK CSeq: 312
-
4 SETUP
建立请求指定如何传输单个媒体流。这必须在发送PLAY请求之前完成。请求包含媒体流URL和传输说明符。该说明符通常包括用于接收RTP数据(音频或视频)的本地端口,另一个用于RTCP数据(元信息)。服务器回复通常会确认所选参数,并填写缺少的部分,例如服务器选择的端口。必须在发送聚合播放请求之前,使用SETUP配置每个媒体流。C->S: SETUP rtsp://example.com/foo/bar/baz.rm RTSP/1.0 CSeq: 302 Transport: RTP/AVP;unicast;client_port=4588-4589 S->C: RTSP/1.0 200 OK CSeq: 302 Date: 23 Jan 1997 15:35:06 GMT Session: 47112344 Transport: RTP/AVP;unicast; client_port=4588-4589;server_port=6256-6257
-
5 PLAY
播放请求 将导致播放一个或所有媒体流。可以通过发送多个播放请求来堆叠播放请求。URL可以是聚合URL(播放所有媒体流)或单个媒体流URL(仅播放该流)。可以指定范围。如果没有指定范围,流将从头开始播放,并播放到最后,或者如果流暂停,则在暂停点恢复播放。C->S: PLAY rtsp://audio.example.com/twister.en RTSP/1.0 CSeq: 833 Session: 12345678 Range: smpte=0:10:20-;time=19970123T153600Z S->C: RTSP/1.0 200 OK CSeq: 833 Date: 23 Jan 1997 15:35:06 GMT Range: smpte=0:10:22-;time=19970123T153600Z
-
6 PAUSE
暂停请求 暂时停止一个或所有媒体流,因此稍后可以通过播放请求恢复。请求包含聚合或媒体流URL。PAUSE请求中的范围参数指定何时暂停。当省略范围参数时,暂停会立即无限期地发生。C->S: PAUSE rtsp://example.com/fizzle/foo RTSP/1.0 CSeq: 834 Session: 12345678 S->C: RTSP/1.0 200 OK CSeq: 834 Date: 23 Jan 1997 15:35:06 GMT
-
7 TEARDOWN
停止发布流请求用于终止会话。它停止所有媒体流,并释放所有与会话相关的数据在服务器上。C->S: TEARDOWN rtsp://example.com/fizzle/foo RTSP/1.0 CSeq: 892 Session: 12345678 S->C: RTSP/1.0 200 OK CSeq: 892
-
8 GET_PARAMETER
获取参数请求检索在URI中指定的呈现或流的参数的值。答复和回复的内容留给实施。S->C: GET_PARAMETER rtsp://example.com/fizzle/foo RTSP/1.0 CSeq: 431 Content-Type: text/parameters Session: 12345678 Content-Length: 15 packets_received jitter C->S: RTSP/1.0 200 OK CSeq: 431 Content-Length: 46 Content-Type: text/parameters packets_received: 10 jitter: 0.3838
-
9 SET_PARAMETER
设置参数请求设置由URI指定的演示文稿或流的参数值。C->S: SET_PARAMETER rtsp://example.com/fizzle/foo RTSP/1.0 CSeq: 421 Content-length: 20 Content-type: text/parameters barparam: barstuff S->C: RTSP/1.0 451 Invalid Parameter CSeq: 421 Content-length: 10 Content-type: text/parameters barparam
-
10 REDIRECT
重定向请求通知客户端它必须连接到另一个服务器位置。它包含强制性头文件位置,表示客户端应发出该URL的请求。它可能包含参数Range,它指示重定向何时生效。如果客户端希望继续发送或接收此URI的媒体,则客户端必须向指定的主机发出针对当前会话的TEARDOWN请求和新会话的SETUP。S->C: REDIRECT rtsp://example.com/fizzle/foo RTSP/1.0 CSeq: 732 Location: rtsp://bigserver.com:8001 Range: clock=19960213T143205Z-
-
11 RECORD
记录请求根据呈现描述开始记录一系列媒体数据。时间戳反映开始和结束时间(UTC)。如果没有给定时间范围,请使用演示文稿描述中提供的开始或结束时间。如果会话已经开始,请立即开始录制。服务器决定是否将记录的数据存储在请求URI或其他URI下。如果服务器不使用请求URI,则响应应为201,并包含描述请求状态并引用新资源的实体以及Location头。C->S: RECORD rtsp://example.com/meeting/audio.en RTSP/1.0 CSeq: 954 Session: 12345678 Conference: 128.16.64.19/32492374
-
12 Embedded (Interleaved) Binary Data
嵌入式(交错式)二进制数据,某些防火墙设计和其他情况可能会强制服务器交叉RTSP方法和流数据。除非有必要,通常应避免这种交错,因为它会使客户端和服务器操作复杂化,并增加额外的开销。交叉二进制数据只能在RTSP通过TCP传输时使用。诸如RTP数据包之类的流数据由ASCII码符号(24个十六进制)封装,后跟一个字节的信道标识符,后面是封装二进制数据的长度,以二进制字节为单位,以网络字节顺序排列。流数据紧随其后,没有CRLF,但包括上层协议头。每个$块只包含一个上层协议数据单元,例如一个RTP包。C->S: SETUP rtsp://foo.com/bar.file RTSP/1.0 CSeq: 2 Transport: RTP/AVP/TCP;interleaved=0-1 S->C: RTSP/1.0 200 OK CSeq: 2 Date: 05 Jun 1997 18:57:18 GMT Transport: RTP/AVP/TCP;interleaved=0-1 Session: 12345678 C->S: PLAY rtsp://foo.com/bar.file RTSP/1.0 CSeq: 3 Session: 12345678 S->C: RTSP/1.0 200 OK CSeq: 3 Session: 12345678 Date: 05 Jun 1997 18:59:15 GMT RTP-Info: url=rtsp://foo.com/bar.file; seq=232433;rtptime=972948234 S->C: $\000{2 byte length}{"length" bytes data, w/RTP header} S->C: $\000{2 byte length}{"length" bytes data, w/RTP header} S->C: $\001{2 byte length}{"length" bytes RTCP packet}
状态码定义
1xx:信息 - 收到请求,继续处理
2xx:成功 - 该行动已成功收到,理解,并接受
3xx:重定向 - 必须采取进一步行动完成请求
4xx:客户端错误 - 请求包含错误的语法或不能完成
5xx:服务器错误 - 服务器未能完成有效请求
状态码 | 定义 |
---|---|
100 | 继续 |
200 | 成功 |
201 | 创建 |
250 | 存储空间不足 |
300 | 多种选择 |
301 | 永久移动 |
302 | 暂时移动 |
303 | 见其他 |
304 | 没有修改 |
305 | 使用代理服务器 |
400 | 错误的请求 |
401 | 未授权 |
402 | 需要付款 |
403 | 被禁止 |
404 | 未找到 |
405 | 方法不允许 |
406 | 不能接受的 |
407 | 需要代理验证 |
408 | 请求超时 |
410 | 不在 |
411 | 长度要求 |
412 | 前提条件失败 |
413 | 请求的实体太大 |
414 | 请求URI太大 |
415 | 不支持的媒体类型 |
451 | 参数未被理解 |
452 | 会议未找到 |
453 | 没有足够的带宽 |
454 | 找不到会话 |
455 | 方法在此状态下无效 |
456 | 标头字段对资源无效 |
457 | 无效范围 |
458 | 参数是只读的 |
459 | 不允许聚合操作 |
460 | 只允许聚合操作 |
461 | 不支持的运输 |
462 | 目标无法访问 |
500 | 内部服务器错误 |
501 | 未实现 |
502 | 错误的网关 |
503 | 暂停服务 |
504 | 网关超时 |
505 | 不支持RTSP版本 |
551 | 选项不受支持 |