基本概念 RTSP协议的实现 DESCRIBE rtsp://streaming.site.com/foo.mov RTSP/1.0
CSeq: 1 Accept: application/sdp User-agent: QTS/1.0 接下来,服务器按顺序调用注册了特定角色的模块。需要指出的是,注册了同一角色的不同模块的调用次序是不确定的。如图所示为对RTSP请求的处理过程: 第一个被调用的角色是RTSP Filter Role,调用的时候会携带RTSPrequest对象作为参数。模块可以对RTSPRequest的qtssRTSPReqFullRequest属性进行修改。服务器根据被调用的模块是否对请求做了应答来决定后面的调用,如果注册了RTSP Filter Role的某一个模块在被调用的时候对请求作出了应答,服务器将立即调用注册了RTSP Postprocessor Role的模块,不再调用其他尚未调用的注册了RTSP Filter Role的模块,否则服务器调用其它注册了RTSP Filter Role的模块,所有注册了RTSP Filter Role的模块都被调用后,服务器对RTSP请求进行解析,通过分析qtssRTSPReqFullRequest为其它属性赋值,另外还要创建两个会话,一个会话是RTSP Session,一个会话是Client Session。 RTSP Session与相应的RTSP请求相关联,在客户端关闭RTSP连接的时候会话也被关闭。Client Session与发起请求的客户连接相关联,一直到客户端流媒体播放完毕后被关闭。 接下来,服务器将调用注册了RTSP Route Role的模块,并携带RTSP请求对象作为参数。注册了RTSP Route Role的模块可以对RTSP请求对象的qtssRTSPReqRootDir属性进行修改。同调用注册了RTSP Filter Role的模块时的处理策略一样,服务器在调用注册了RTSP Route Role的模块的时候,如果有模块发送了应答,则立刻调用注册了RTSP Postprocessor Role的模块,否则继续调用注册了RTSP Route Role的其它模块。 当所有注册了RTSP Route Role的模块都被调用了,服务器将调用注册了RTSP Preprocessor Role的模块。注册了RTSP Preprocessor Role的模块根据qtssRTSPReqAbsoluteURL的值判断是否能处理该请求的类型。如果请求的类型和被调用的模块所能处理的类型匹配,则 该模块调用QTSS_Write或者QTSS_WriteV对请求进行应答。如果是标准的应答,可以调用 QTSS_SendStandardRTSPResponse
注册了RTP Send Packets Role的模块调用QTSS_Write或者QTSS_WriteV通过RTP session向客户端发送流媒体数据。模块发送了一些数据后,就返回到服务器,并给出下次调用模块发送数据之前等待的时间。服务器循环调用模块发送流媒体数据,直到所有的流媒体数据都发送完毕或者该会话被暂停或关闭。
|