计算机系统应用教程网站

网站首页 > 技术文章 正文

rtsp协议之请求响应示例

btikc 2024-11-25 10:04:03 技术文章 44 ℃ 0 评论

RTSP的请求响应示例

其中C是客户端,S是服务端。

1. OPTIONS:

用于得到服务器提供的可用方法;

如:

OPTIONS rtsp://192.168.20.136:5000/xxx666 RTSP/1.0

CSeq: 1

服务器的回应信息会在Public字段列出提供的方法。如:

RTSP/1.0 200 OK

CSeq: 1 //每个回应消息的cseq数值和请求消息的cseq相对应

Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE

2. DESCRIBE:

客户端向服务器端发送DESCRIBE,用于得到URI所指定的媒体描述信息,一般是SDP信息。客户端通过Accept头指定客户端可以接受的媒体述信息类型。

如:

C->S: DESCRIBE rtsp://server.example.com/fizzle/fooRTSP/1.0

CSeq: 312

Accept: application/sdp, application/rtsl,application/mheg)

服务器回应URI指定媒体的描述信息:

如:

S->C: RTSP/1.0 200 OK

CSeq: 312

Date: 23 Jan 1997 15:35:06 GMT

Content-Type: application/sdp //表示回应为SDP信息

Content-Length: 376

//这里为一个空行

//以下为具体的SDP信息

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

//字段解释

V=0 ;Version 给定了SDP协议的版本

o=<username><session id> <version> <network type> <address type>

<address>; Origin ,给定了会话的发起者信息

s=<sessionname> ;给定了Session Name

i=<sessiondescription> ; Information 关于Session的一些信息

u=<URI> ; URI

e=<emailaddress> ;Email

c=<networktype> <address type> <connection address> ;Connect Data包含连接数据

t=<start time><stop time> ;Time

a=<attribute> ; Attribute

a=<attribute>:<value>

m=<media><port> <transport> <fmt list> ; MediaAnnouncements

媒体初始化是任何基于RTSP系统的必要条件,但RTSP规范并没有规定它必须通过DESCRIBE方法完成。RTSP客户端可以通过以下方法来接收媒体描述信息:

a) 通过DESCRIBE方法;

b) 其它一些协议(HTTP,email附件,等);

c) 通过命令行或标准输入设备

另一个例子:

命令名称:DESCRIBE

命令作用:请求SDP

命令格式:

DESCRIBE<BLANK><RTSP URI><BLANK>RTSP/<RTSP VERSION>\r\nCSeq:<BLANK><COMMAND SEQUENCE>\r\n\r\n

(Note:<BLANK>:空格;<COMMAND SEQUENCE>:命令序列,每一次发送命令该数字加1)

命令示例:

DESCRIBE rtsp://127.0.0.1/ansersion RTSP/1.0

CSeq: 1

(Note:虽然看不见,但示例中最后是有空行的,必不可少哦!看看“命令格式”最后连着两个"\r\n"你就明白了。空行(\r\n)是RTSP数据包的结束标识。)

服务端返回信息格式:

RTSP/<RTSP VERSION><BLANK><STATE ID><BLANK><STATE DESCRIBE>\r\nCSeq:<BLANK><COMMAND SEQUENCE>\r\n<OTHER>\r\n\r\n<SDP>

(Note:<OTHER>: 其他描述信息;<SDP>: SDP描述信息,SDP不属于RTSP的打包数据,这里可以看到空行(\r\n)在SDP之前)

服务端返回信息示例:

RTSP/1.0 200 OK

CSeq: 1

Date: Sun, Dec 27 2015 02:16:50 GMT

Content-Base: rtsp://127.0.0.1/ansersion/

Content-Type: application/sdp

Content-Length: 510

v=0

o=- 1451182595570866 1 IN IP4 192.168.81.145

s=Session streamed by "testOnDemandRTSPServer"

i=ansersion

t=0 0

a=tool:LIVE555 Streaming Media v2015.11.09

a=type:broadcast

a=control:*

a=range:npt=0-

a=x-qt-text-nam:Session streamed by "testOnDemandRTSPServer"

a=x-qt-text-inf:ansersion

m=video 0 RTP/AVP 96

c=IN IP4 0.0.0.0

b=AS:500

a=rtpmap:96 H264/90000

a=fmtp:96 packetization-mode=1;profile-level-id=4D4033;sprop-parameter-sets=Z01AM5JUDAS0IAAAAwBAAAAM0eMGVA==,aO48gA==

a=control:track1

(Note:以RTSP客户端的角度,以上红字部分信息必须理解。

首先是"RTSP/1.0 200 OK",这个表示RTSP服务端成功受理客户端的请求。

再者是“m=video 0 RTP/AVP 96”,该信息指出了RTSP客户端提供传输的流媒体类型,“a=control:track1”指出了访问该流媒体的方式,是后续SETUP命令的重要参数,这是一个简化的版本,有时候服务端会返回完整版本:“a=control:rtsp://127.0.0.1/ansersion/track1”。

最后是“Z01AM5JUDAS0IAAAAwBAAAAM0eMGVA==”和“aO48gA==”,这是H264的SPS和PPS的Base64编码。老实说,要让RTSP客户端去考虑具体编码格式的问题,着实是一个设计上的瑕疵。后续我打算把这部分改掉,现在我们将其看作H264的重要参数即可)

在SDP中也说明了本次会话的属性

SDP 参数

下面描述了如何在 SDP 中表示一个 H.264 流:

. "m=" 行中的媒体名必须是 "video"

. "a=rtpmap" 行中的编码名称必须是 "H264".

. "a=rtpmap" 行中的时钟频率必须是 90000.

. 其他参数都包括在 "a=fmtp" 行中.

如:

m=video 49170 RTP/AVP 98

a=rtpmap:98 H264/90000

a=fmtp:98 profile-level-id=42A01E; packetization-mode=1; sprop-parameter-sets=Z0IACpZTBYmI,aMljiA==

下面介绍一些常用的参数.

1). packetization-mode:

表示支持的封包模式.

当 packetization-mode 的值为 0 时或不存在时, 必须使用单一 NALU 单元模式.

当 packetization-mode 的值为 1 时必须使用非交错(non-interleaved)封包模式.

当 packetization-mode 的值为 2 时必须使用交错(interleaved)封包模式.

每个打包方式允许的NAL单元类型总结(yes = 允许, no = 不允许, ig = 忽略)

Type Packet Single NAL Non-Interleaved Interleaved

Unit Mode Mode Mode

-------------------------------------------------------------

0 undefined ig ig ig

1-23 NAL unit yes yes no

24 STAP-A no yes no

25 STAP-B no no yes

26 MTAP16 no no yes

27 MTAP24 no no yes

28 FU-A no yes yes

29 FU-B no no yes

30-31 undefined ig ig ig

这个参数不可以取其他的值.

2). sprop-parameter-sets: SPS,PPS

这个参数可以用于传输 H.264 的序列参数集和图像参数 NAL 单元. 这个参数的值采用 Base64 进行编码. 不同的参数集间用","号隔开.

3).profile-level-id:

这个参数用于指示 H.264 流的 profile 类型和级别. 由 Base16(十六进制) 表示的 3 个字节. 第一个字节表示 H.264 的 Profile 类型, 第三个字节表示 H.264 的 Profile 级别:

4).max-mbps:

这个参数的值是一个整型, 指出了每一秒最大的宏块处理速度.

3. SETUP:

用于确定转输机制,建立RTSP会话。客户端能够发出一个SETUP请求为正在播放的媒体流改变传输参数,服务器可能同意这些参数的改变。若是不同意,它必须响应错误"455 Method Not Valid In This State"。

Request中的Transport头字段指定了客户端可接受的数据传输参数;Response中的Transport 头字段包含了由服务器选出的传输参数。

如:

C->S: SETUP rtsp://example.com/foo/bar/baz.rm RTSP/1.0

CSeq: 302

Transport: RTP/AVP;unicast;client_port=4588-4589

服务器端对SETUPRequest产生一个Session Identifiers。

如:

S->C: RTSP/1.0 200 OK

CSeq: 302

Date: 23 Jan 1997 15:35:06 GMT

Session: 47112344 //产生一个SessionID

Transport: RTP/AVP;unicast;

client_port=4588-4589;server_port=6256-6257

另一个例子:

命令名称:SETUP

命令作用:建立流媒体会话,告知RTSP服务端准备资源,以待后续进一步操作(比如“PLAY”)

命令格式:

SETUP<BLANK><RTSP URI>/<SDP ATTRIBUTE CONTROL>RTSP/<RTSP VERSION>\r\nTransport:<BLANK><PROTOCOL>;<CAST METHOD>;client_port=<RTP PORT>-<RTCP PORT>\r\nCSeq:<BLANK><COMMAND SEQUENCE>\r\n\r\n

(Note:<SDP ATTRIBUTE CONTROL>:SDP中“a=control:track1”;<PROTOCOL>:实时流传输协议,一般为RTP+UDP;<CAST METHOD>:传输方式,单播或组播;)

命令示例:

SETUP rtsp://127.0.0.1/ansersion/track1 RTSP/1.0

Transport: RTP/AVP/UDP;unicast;client_port=10330-10331

CSeq: 2

(Note:使用RTP传输(RTP/AVP/UDP),传输方式为单播(unicast),RTP和RTCP的端口号分别为10330和10331(client_port=10330-10331))

服务端返回信息格式:

RTSP/<RTSP VERSION><BLANK><STATE ID><BLANK><STATE DESCRIBE>\r\nCSeq:<BLANK><COMMAND SEQUENCE>\r\n<OTHER>\r\n<SESSION ID>\r\n\r\n

(Note:<SESSION ID>:服务端建立好资源后,通过该标识访问其媒体流资源。)

服务端返回信息示例:

RTSP/1.0 200 OK

CSeq: 2

Date: Sun, Dec 27 2015 02:28:01 GMT

Transport: RTP/AVP;unicast;destination=127.0.0.1;source=127.0.0.1;client_port=10330-10331;server_port=6970-6971

Session: ABF519D9;timeout=65

(Note:其中“ABF519D9”为SESSION ID,PLAY命令以此为参数,告知服务端以SETUP命令中指定的方式(RTP、unicast、client_port=10330-10331)进行媒体流传输)

4. PLAY:

PLAY方法告知服务器通过SETUP中指定的机制开始发送数据 。在尚未收到SETUP请求的成功应答之前,客户端不可以发出PLAY请求。

PLAY请求将正常播放时间(normal play time)定位到指定范围的起始处,并且传输数据流直到播放范围结束。PLAY请求可能被管道化(pipelined),即放入队列中(queued);

服务器必须将PLAY请求放到队列中有序执行。也就是说,后一个PLAY请求需要等待前一个PLAY请求完成才能得到执行。

比如,在下例中,不管到达的两个PLAY请求之间有多紧凑,服务器首先play第10到15秒,然后立即第20到25秒,最后是第30秒直到结束。

C->S: PLAY rtsp://audio.example.com/audio RTSP/1.0

CSeq: 835

Session: 12345678

Range: npt=10-15

C->S: PLAY rtsp://audio.example.com/audio RTSP/1.0

CSeq: 836

Session: 12345678

Range: npt=20-25

C->S: PLAY rtsp://audio.example.com/audio RTSP/1.0

CSeq: 837

Session: 12345678

Range: npt=30-

Range头可能包含一个时间参数。该参数以UTC格式指定了播放开始的时间。如果在这个指定时间后收到消息,那么播放立即开始。时间参数可能用来帮助同步从不同数据源获取的数据流。

不含Range头的PLAY请求也是合法的。它从媒体流开头开始播放,直到媒体流被暂停。如果媒体流通过PAUSE暂停,媒体流传输将在暂停点(the pause point)重新开始。如果媒体流正在播放,那么这样一个PLAY请求将不起更多的作用,只是客户端可以用此来测试服务器是否存活。

5. PAUSE:

PAUSE请求引起媒体流传输的暂时中断。如果请求URL中指定了具体的媒体流,那么只有该媒体流的播放和记录被暂停(halt)。

比如,指定暂停音频,播放将会无声。如果请求URL指定了一组流,那么在该组中的所有流的传输将被暂停。如:

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

PAUSE请求中可能包含一个Range头用来指定何时媒体流暂停,我们称这个时刻为暂停点(pause point)。该头必须包含一个精确的值,而不是一个时间范围。媒体流的正常播放时间设置成暂停点。

当服务器遇到在任何当前挂起(pending)的PLAY请求中指定的时间点后,暂停请求生效。

如果Range头指定了一个时间超出了任何一个当前挂起的PLAY请求,将返回错误"457 Invalid Range" 。

如果一个媒体单元(比如一个音频或视频禎)正好在一个暂停点开始,那么表示将不会被播放或记录。

如果Range头缺失,那么在收到暂停消息后媒体流传输立即中断,并且暂停点设置成当前正常播放时间。

6. TEARDOWN:

TEARDOWN请求终止了给定URI的媒体流传输,并释放了与该媒体流相关的资源。如:

C->S: TEARDOWN rtsp://example.com/fizzle/foo RTSP/1.0

CSeq: 892

Session: 12345678

S->C: RTSP/1.0 200 OK

CSeq: 892

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表