锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / Darwin服务器 / Darwin概念之模块角色 / RTSP角色
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

RTSP角色


当服务器接收到RTSP请求的时候,会执行一系列步骤来对请求进行处理,并确保将响应发送给客户端。这些步骤包括以预先确定的顺序调用特定的角色。这个部分将会详细地描述每一个角色。如果需要各个角色的概要信息,以及它们的调用系列,请参见“QuickTime流媒体服务器操作概述”部分。

请注意:所有RTSP角色都可以直接向客户进行响应。如果有任何一个RTSP角色对客户端进行响应,服务器会立刻跳过那些正常情况下应该被调用的RTSP角色,然后调用对RTSP请求进行响应的模块中的RTSP Postprocessor角色。


RTSP Filter角色

在接收到RTSP请求的时候,服务器会立刻调用各个模块的RTSP Filter角色--如果它们注册了该角色的话。对Filter角色的处理使模块有机会响应或者修改RTSP请求。

在RTSP Filter角色被调用时,模块会接收到一个QTSS_StandardRTSP_Params类型的结构,该结构定义如下:

typedef struct

{

    QTSS_RTSPSessionObject      inRTSPSession;

    QTSS_RTSPRequestObject      inRTSPRequest;

    char**                      outNewRequest;

}QTSS_StandardRTSP_Params;

inRTSPSession

这是QTSS_RTSPSessionObject对象,表示当前这个RTSP会话。如果需要RTSP会话对象属性的信息,请参见“qtssRTSPSessionObjectType”部分。

inRTSPRequest

这是QTSS_RTSPRequestObject对象,表示当前这个RTSP请求。在RTSP Filter角色被调用的时候,只有qtssRTSPReqFullRequest属性的值是正当的。如果需要RTSP请求对象属性的信息,请参见“qtssRTSPRequestObjectType”部分。

outNewRequest

这是一个指向内存地址的指针。

模块可以通过QTSS_GetValuePtr函数来从qtssRTSPReqFullRequest属性中获取引起服务器调用该角色的RTSP请求的全部信息。qtssRTSPReqFullRequest属性是一个只读属性。如果要修改RTSP请求,模块需要调用QTSS_New函数来分配一个缓冲区,把修改完成的请求写到缓冲区中,然后把该缓冲区的指针通过QTSS_StandardRTSP_Params结构的outNewRequest域返回给上层。

在模块处理RTSP Filter角色时,服务器保证不会调用该模块中其它引用到RTSP会话的角色,这里的RTSP会话由inRTSPSession对象来表示。

如果处理RTSP Filter角色的模块直接对客户端进行响应,则服务器就紧接着调用RTSP Postprocessor角色,如果需要该角色的更多信息,请参见“RTSP Postprocessor角色”部分。

希望自己的RTSP Filter角色被调用的模块必须在其Register角色中调用QTSS_AddRole函数,并将角色的实参指定为QTSS_RTSPFilter_Role常数。

在处理完成这个角色之后,模块通常应该返回QTSS_NoErr。


RTSP Route角色

服务器在调用所有注册RTSP Filter角色的模块之后,就接着调用各个模块的RTSP Route角色。模块有义务对这个角色进行处理,即通过改变qtssRTSPReqRootDir属性的值,为每个RTSP请求设定一个正确的根目录。

在被调用的时候,RTSP Route角色会接收到一个QTSS_StandardRTSP_Params结构,该结构的定义如下:

typedef struct

{

    QTSS_RTSPSessionObject      inRTSPSession;

    QTSS_RTSPRequestObject      inRTSPRequest;

    QTSS_RTSPHeaderObject       inRTSPHeaders;

    QTSS_ClientSessionObject    inClientSession;

} QTSS_StandardRTSP_Params;

inRTSPSession

这是一个QTSS_RTSPSessionObject对象,代表当前这个RTSP会话。如果需要RTSP会话对象的属性信息,请参见“qtssRTSPSessionObjectType”部分。

inRTSPRequest

这是一个QTSS_RTSPRequestObject对象,代表当前这个RTSP请求。在Route角色和随后的所有RTSP角色,所有的属性都被赋值了。如果需要RTSP请求对象的属性信息,请参见“qtssRTSPRequestObjectType”部分。

inRTSPHeaders

这是一个QTSS_RTSPHeaderObject对象,代表RTSP的报头信息。如果需要RTSP报头对象的属性信息,请参见“qtssRTSPHeaderObjectType”部分。

inClientSession

这是一个QTSS_ClientSessionObject对象,代表客户会话。如果需要客户会话对象的属性信息,请参见“qtssClientSessionObjectType”部分。

在调用模块的RTSP Route角色之前,服务器会首先对请求进行解析,并在解析的过程中对QTSS_StandardRTSP_Params结构中QTSS_RTSPSessionObject和QTSS_RTSPRequestObject成员的所有属性进行赋值。

处理RTSP Route角色的模块可以修改QTSS_StandardRTSP_Params结构中QTSS_RTSPRequestObject成员的qtssRTSPReqRootDir属性。修改qtssRTSPReqRootDir属性会改变RTSP请求的根目录。

在模块处理RTSP Route角色的同时,服务器保证不会调用该模块中引用到RTSP会话的其它角色,这里的RTSP会话由inRTSPSession参数来表示。

如果处理RTSP Route角色的模块直接对客户端进行响应,则服务器会立刻跳过其它角色的处理,然后调用该响应模块的RTSP Postprocessor角色。如果需要该角色的信息,请参“RTSP Postprocessor角色”部分。

希望自己的RTSP Route角色被调用的模块必须在其Register角色中调用QTSS_AddRole函数,并将角色的实参指定为QTSS_RTSPRoute_Role常数。

在处理完成这个角色之后,模块通常应该返回QTSS_NoErr。


RTSP Preprocessor角色

服务器以RTSP Route角色调用了所有注册了该角色的模块之后,就接着调用RTSP Preprocessor角色。如果模块处理了相关类型的RTSP请求,就有义务处理这个角色,以便向客户端发送正确的RTSP响应。

在被调用的时候,RTSP Preprocessor角色接收到一个QTSS_StandardRTSP_Params结构,该结构定义如下:

typedef struct

{

    QTSS_RTSPSessionObject  inRTSPSession;

    QTSS_RTSPRequestObject  inRTSPRequest;

    QTSS_RTSPHeaderObject   inRTSPHeaders;

    QTSS_ClientSessionObjectinClientSession;

} QTSS_StandardRTSP_Params;

inRTSPSession

这是一个QTSS_RTSPSessionObject对象,代表当前这个RTSP会话。如果需要RTSP会话对象的属性信息,请参见“qtssRTSPSessionObjectType”部分。

inRTSPRequest

这是一个QTSS_RTSPRequestObject对象,代表当前这个RTSP请求,每个属性都有值。如果需要RTSP请求对象的属性信息,请参见“qtssRTSPRequestObjectType”部分。

inRTSPHeaders

这是一个QTSS_RTSPHeaderObject对象,代表RTSP的报头信息。如果需要RTSP报头对象的属性信息,请参见“qtssRTSPHeaderObjectType”部分。

inClientSession

这是一个QTSS_ClientSessionObject对象,代表客户会话。如果需要客户会话对象的属性信息,请参见“qtssClientSessionObjectType”部分。

RTSP Preprocessor角色通常会使用QTSS_StandardRTSP_Params结构中inRTSPRequest成员的qtssRTSPReqFilePath属性来确定当前请求的类型和模块希望处理的请求类型是否互相匹配。举例来说,一个模块可能只处理以.mov或.sdp结尾的URL。

如果请求的类型互相匹配,则处理RTSP Preprocessor角色的模块就会调用QTSS_SendStandardRTSPResponse,QTSS_Write,或QTSS_WriteV函数,或者调用QTSS_AppendRTSPHeader和QTSS_SendRTSPHeaders函数,来对客户断进行响应。如果这个模块同时还负责为客户会话生成RTP包,则应该调用QTSS_AddRTPStream函数来把流添加到客户会话中,或者调用QTSS_Play函数,这个调用将使服务器调用当前模块的RTP Send Packets角色。

在模块处理RTSP Preprocessor角色时,服务器保证不会调用该模块中其它引用到RTSP会话或者客户会话的角色,这里的RTSP会话由inRTSPSession来表示,而客户会话则由inClientSession来表示。

希望自己的RTSP Preprocessor角色被调用的模块必须在其Register角色中调用QTSS_AddRole函数,并将角色的实参指定为QTSS_RTSPPreProcessor_Role常数。

在处理完成这个角色之后,模块通常应该返回QTSS_NoErr。


RTSP Request角色

如果没有RTSP Preprocessor角色对RTSP请求做出响应的话,服务器就会调用RTSP Request角色。只有一个模块的RTSP Request角色会被调用,就是当服务器启动的时候,第一个注册RTSP Request角色的模块。

在被调用的时候,RTSP Request角色会接收到一个QTSS_StandardRTSP_Params结构,该结构的定义如下:

typedef struct

{

    QTSS_RTSPSessionObject      inRTSPSession;

    QTSS_RTSPRequestObject      inRTSPRequest;

    QTSS_RTSPHeaderObject       inRTSPHeaders;

    QTSS_ClientSessionObject    inClientSession;

} QTSS_StandardRTSP_Params;

inRTSPSession

这是一个QTSS_RTSPSessionObject对象,代表当前这个RTSP会话。如果需要RTSP会话对象的属性信息,请参见“qtssRTSPSessionObjectType”部分。

inRTSPRequest

这是一个QTSS_RTSPRequestObject对象,代表当前这个RTSP请求,每个属性都有值。如果需要RTSP请求对象的属性信息,请参见“qtssRTSPRequestObjectType”

inRTSPHeaders

这是一个QTSS_RTSPHeaderObject对象,代表RTSP的报头信息。如果需要RTSP报头对象的属性信息,请参见“qtssRTSPHeaderObjectType”部分。

inClientSession

这是一个QTSS_ClientSessionObject对象,代表客户会话。如果需要客户会话对象的属性信息,请参见 “qtssClientSessionObjectType”部分。

和处理RTSP Preprocessor角色的模块一样,处理RTSP Request角色的模块应该通过某些属性来确定当前这个请求是否与自己能处理的请求类型相匹配,比如通过QTSS_StandardRTSP_Params结构中inRTSPRequest成员的qtssRTSPReqFilePath属性进行判断。

处理RTSP Request角色的模块应该按照如下方式响应客户请求:

  • 调用QTSS_AppendRTSPHeader和QTSS_SendRTSPHeaders函数,或者调用QTSS_SendStandardRTSPResponse函数,也可以调用QTSS_Write或QTSS_WriteV函数,向客户端发送RTSP响应。
  • 通过RTP的回调函数,比如QTSS_AddRTPStream和QTSS_Play函数,来为流准备QTSS_ClientSessionObject对象。如果QTSS_Play函数被调用,则服务器就会在模块应该生成发送给客户端的RTP数据包时,调用该模块的RTP Send Packets角色。

希望自己的RTSP Request角色被调用的模块必须在其Register角色中调用QTSS_AddRole函数,并将角色的实参指定为QTSS_RTSPRequest_Role常数。第一个成功调用QTSS_AddRole a函数,并为之指定QTSS_RTSPRequest_Role角色的模块是唯一一个可以被以RTSP Request角色调用的模块。

在处理完成这个角色之后,模块通常应该返回QTSS_NoErr。


RTSP Postprocessor角色

如果模块注册了RTSP Postprocessor角色,则在该模块响应RTSP请求的任何时候,服务器都会调用其RTSP Postprocessor角色。

模块可以通过RTSP Postprocessor角色来记录一些统计信息。

在被调用的时候,RTSP Postprocessor角色会接收到一个QTSS_StandardRTSP_Params结构,该结构的定义如下:

typedef struct

{

    QTSS_RTSPSessionObject      inRTSPSession;

    QTSS_RTSPRequestObject      inRTSPRequest;

    QTSS_RTSPHeaderObject       inRTSPHeaders;

    QTSS_ClientSessionObject    inClientSession;

} QTSS_StandardRTSP_Params;

inRTSPSession

这是一个QTSS_RTSPSessionObject对象,代表当前这个RTSP会话。如果需要RTSP会话对象的属性信息,请参见“qtssRTSPSessionObjectType”部分。

inRTSPRequest

这是一个QTSS_RTSPRequestObject对象,代表当前这个RTSP请求,每个属性都有值。如果需要RTSP请求对象的属性信息,请参见“qtssRTSPRequestObjectType”部分。

inRTSPHeaders

这是一个QTSS_RTSPHeaderObject object对象,代表RTSP的报头信息。如果需要RTSP报头对象的属性信息,请参见“qtssRTSPHeaderObjectType”部分。

inClientSession

这是一个QTSS_ClientSessionObject对象,代表客户会话。如果需要客户会话对象的属性信息,请参见“qtssClientSessionObjectType”部分。

在模块处理RTSP Postprocessor角色时,服务器保证不会调用该模块中其它引用到RTSP会话或者客户会话的角色,这里的RTSP会话由inRTSPSession来表示,而客户会话则由inClientSession来表示。

希望自己的RTSP Postprocessor角色被调用的模块必须在其Register角色中调用QTSS_AddRole函数,并将角色的实参指定为 QTSS_RTSPPostProcessor_Role常数。

在处理完成这个角色之后,模块通常应该返回QTSS_NoErr。

友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内