RTSP协议详解

参考资料地址

http://blog.sina.com.cn/s/blog_450e44880100mfiu.html

http://www.mikewootc.com/wiki/net/protocol/rtsp.html

 

RTSP,实时流传输协议,是TCP/UDP协议体系中的一个应用层协议,由哥伦比亚大学, 网景和RealNetworks公司提交的IETF RFC标准.该协议定义了一对多应用程序如何有效地通过IP网络传输多媒体数据。RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或者RTP完成数据传输。

流媒体服务协议栈

RTSP提供了一个可扩展框架,使实时数据,如音频与视频的受控点播成为可能,数据源包括现场数据与存储在剪辑中数据。该协议目的在于控制多个数据发送链接,Wie选择发送通道。如UDP 组播UDP与TCP,提供途径,并为选择基于RTP上发送机制提供方法。

它的语法和运作跟HTTP 1.1类似, 但并不特别强调时间同步, 所以比较能容忍网络延迟.

HTTP与RTSP相比, * HTTP传送HTML. HTTP请求由客户机发出, 服务器作出响应 * RTSP传送的是多媒体数据. 使用RTSP时, 客户机和服务器都可以发出请求, 即RTSP可以是双向的.

RTSP是用来控制声音或影像的多媒体串流协议,并允许同时多个串流需求控制,传输时所用的网络通信协议并不在其定义的范围内,服务器段可以自动选择使用TCP或UDP来传送串流内容。

而前面提到的允许同时多个串流需求控制,除了可以减低服务器端的网络用量,更能支持多方视讯会议,因为与HTTP 1.1的运作方式相似,所以代理服务器的快选功能,同样适用于RTSP,并因RTSP具有重新导向功能,可视实际负载情况来转换提供服务的服务器,以避免过大的负载集中在同一服务器而造成延迟。

该协议用于CS模型,是一个基于文本的协议,用于在客户端和服务器段建立和协商实时流会话。

实时流协议建立并控制一个或几个时间同步的连续流媒体,尽管连续媒体流与控制流交换是可可能的。通常它本省并不发送连续流,换言之,RTSP充当多媒体服务器的网络远程控制,RTSP链接没有绑定到传输层链接,如TCP,在RTSP连接期间,RTSP用户可以打开或关闭多个服务器的可传输连接已发出RTSP请求。此外,可以使用无连接传输协议,如UDP,RTSP流控制的流可能用到RTP,但RTSP操作并不依赖用于携带连续媒体的传输机制.

下面给出具体实现过程

(1)客户端发起RTSP OPTION请求,目的是得到服务器提供什么方法。RTSP提供的方法一般包括OPTIONS、DESCRIBE、SETUP、TEARDOWN、PLAY、PAUSE、SCALE、GET_PARAMETER。

(2)服务器对RTSP OPTION回应,服务器实现什么方法就回应哪些方法。在此系统中,我们只对DESCRIBE、SETUP、TEARDOWN、PLAY、PAUSE方法做了实现。

(3)客户端发起RTSP DESCRIBE请求,服务器收到的信息主要有媒体的名字,解码类型,视频分辨率等描述,目的是为了从服务器那里得到会话描述信息(SDP)。

(4)服务器对RTSP DESCRIBE响应,发送必要的媒体参数,在传输H.264文件时,主要包括SPS/PPS、媒体名、传输协议等信息。

(5)客户端发起RTSP SETUP请求,目的是请求会话建立并准备传输。请求信息主要包括传输协议和客户端端口号。

(6)服务器对RTSP SETUP响应,发出相应服务器端的端口号和会话标识符。

(7)客户端发出了RTSP PLAY的请求,目的是请求播放视频流。

(8)服务器对RTSP PLAY响应,响应的消息包括会话标识符,RTP包的序列号,时间戳。此时服务器对H264视频流封装打包进行传输。

(9)客户端发出RTSP TEARDOWN请求,目的是关闭连接,终止传输。

(10)服务器关闭连接,停止传输。

3. SETUP请求消息处理过程

        RTSPClientSession类用于处理单独的客户会话。其类成员函数handleCmd_SETUP()处理客户端的SETUP请求。调用parseTransportHeader()对SETUP请求的传输头解析,调用子会话(这里具体实现类为OnDemandServerMediaSubsession)的getStreamParameters()函数获取流媒体发送传输参数。将这些参数组装成响应消息,返回给客户端。

        获取发送传输参数的过程:调用子会话(具体实现类MPEG1or2DemuxedServerMediaSubsession)的createNewStreamSource(...)创建MPEG1or2VideoStreamFramer,选择发送传输参数,并调用子会话的createNewRTPSink(...)创建MPEG1or2VideoRTPSink。同时将这些信息保存在StreamState类对象中,用于记录流的状态。

        客户端发送两个SETUP请求,分别用于建立音频和视频的RTP接收。

 

 

 

 

4. PLAY请求消息处理过程

      RTSPClientSession类成员函数handleCmd_PLAY()处理客户端的播放请求。首先调用子会话的startStream(),内部调用MediaSink::startPlaying(...),然后是MultiFramedRTPSink::continuePlaying(),接着调用MultiFramedRTPSink::buildAndSendPacket(...)。buildAndSendPacke内部先设置RTP包头,内部再调用MultiFramedRTPSink::packFrame()填充编码帧数据。

      packFrame内部通过FramedSource::getNextFrame(), 接着MPEGVideoStreamFramer::doGetNextFrame(),再接着经过MPEGVideoStreamFramer::continueReadProcessing(), FramedSource::afterGetting(...), MultiFramedRTPSink::afterGettingFrame(...), MultiFramedRTPSink::afterGettingFrame1(...)等一系列繁琐调用,最后到了MultiFramedRTPSink::sendPacketIfNecessary(), 这里才真正发送RTP数据包。然后是计算下一个数据包发送时间,把MultiFramedRTPSink::sendNext(...)函数句柄传给任务调度器,作为一个延时事件调度。在主循环中,当MultiFramedRTPSink::sendNext()被调度时,又开始调用MultiFramedRTPSink::buildAndSendPacket(...)开始新的发送数据过程,这样客户端可以源源不断的收到服务器传来的RTP包了。

发送RTP数据包的间隔计算方法:

        Update the time at which the next packet should be sent, based on the duration of the frame that we just packed into it.

 

posted @ 2016-08-08 14:59  大大的海棠湾  阅读(10893)  评论(0编辑  收藏  举报