RTSP的消息有两大类,一是请求消息(request),一是回应消息 (response),两种消息的格式不同.
请求消息:
方法 URI RTSP版本 CR LF
消息头 CR LF CR LF
消息体 CR LF
其中方法包括OPTIONS回应中所有的命令,URI是接收方的地址,例如:rtsp://192.168.22.136:5000/v0
RTSP版本一般都是RTSP/1.0.每行后面的CR LF表示回车换行,需要接收端有相应的解析,最后一个消息头需要有两个CR LF
回应消息:
RTSP版本 状态码 解释 CR LF
消息头 CR LF CR LF
消息体 CR LF
简单的rtsp交互过程:
C表示RTSP客户端,S表示RTSP服务端
1.C->S:OPTIONS request //询问S有哪些方法可用
1.S->C:OPTIONS response //S回应信息中包括提供的所有可用方法
2.C->S:DESCRIBE request //要求得到S提供的媒体初始化描述信息
2.S->C:DESCRIBE response //S回应媒体初始化描述信息,主要是sdp
3.C->S:SETUP request //设置会话的属性,以及传输模式,提醒S建立会话
3.S->C:SETUP response //S建立会话,返回会话标识符,以及会话相关信息
4.C->S:PLAY request //C请求播放
4.S->C:PLAY response //S回应该请求的信息
S->C:发送流媒体数据
5.C->S:TEARDOWN request //C请求关闭会话
5.S->C:TEARDOWN response //S回应该请求
来自:http://my.oschina.net/alphajay/blog/4452
----------------------------------------------------------
一眼看过去,感觉这协议还挺简单的,也就很普通的交互过程嘛,但是,当每一个命令都是自己写处理函数的时候才发现,看似简单的东西,里面并没有那么简单。当一个个小小的问题都要自己考虑时才会发现,这是一个大问题。
协议的命令意义如下:
1:options
这个通常由client发送server,询问服务器所支持的方法种类,当然在应用中也可以用来作为心跳,因为它是状态无关的.
2:describe
按照字面意思,就是描述,描述什么呢?当然是流媒体的信息呢,在返回的应答中包含SDP.
(这里提到了SDP,后面写)
在应答中, 我们重点关注SDP字段.在SDP中,我们看到了流媒体包含了2个资源(m行):audio和video,其中a行是m(media)的属性描述.在m行中,中间的数字为服务端推荐客户端接收的端口,如果服务端不想这样做,可以将port置为0.在sdp中,还有a=control字段。
3:setup
建立会话,如果支持集合控制,在setup中会包含session字段.
通过setup的响应,即建立了流媒体的会话.后续的setup必须带上session字段,通过上面的消息我们看到客户端发送了2次setup,分别是代表video的track1和audio的track2.如果服务端不支持集合操作,那么setup里带上session字段则是非法的.在消息中,我们看到了transport字段,在这里表明了客户端接收流媒体的端口,以及编码格式.在本例中采用的是udp方式传送RTP,如果采用TCP的方式传送 RTP,则可能transport 字段为:Transport: RTP/AVP/TCP;unicast;interleaved=0-1 ,这里解释下interleaved,因为采用TCP方式传送,所以传送的RTP,RTCP包都在同一个链路上,需要区分,所以有了 interleaved,0表示是RTP的通道,1表示是RTCP的通道.
4:play
play 即对流媒体的播放指令:
通常在play中有range字段,但不是必需的.这个字段表示播放的流媒体的范围.
5:teardown
teardown指令即对流媒体的结束
在teardown中是否必须带有session,我们曾经进行过讨论.如果一个session对应一个链路,则可以不需要对应session,但是在我们遇到的应用中,teardown基本都是携带了teardown.
参考:http://hi.baidu.com/yg_110/blog/item/e90d95fc33d8f4fafc037f59.html
--------------------------------------------------------------
协议的各个命令里,感觉SDP是重点,SETUP是关键点,其中的transport字段直接影响着发送方式。
“Transport参数设置了传输模式。RTP/AVP /TCP表示通过TCP传输RTP包,RTP/AVP表示使用UDP 传输RTP包。unicast表示单播。interleaved值有两个:0和1,0表示RTP包,1 表示RTCP包,接收端根据interleaved的值来区别是哪种数据包。client_port值有3008和3009,3008表示客户端接收 RTP包的端口,3009表示客户端接收RTCP包的端口,服务端要分别将RTP包和RTCP包发送到这两个端口。”