精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
当服务器接收到RTSP请求的时候,会执行一系列步骤来对请求进行处理,并确保将响应发送给客户端。这些步骤包括以预先确定的顺序调用特定的角色。这个部分将会详细地描述每一个角色。如果需要各个角色的概要信息,以及它们的调用系列,请参见“QuickTime流媒体服务器操作概述”部分。
请注意:所有RTSP角色都可以直接向客户进行响应。如果有任何一个RTSP角色对客户端进行响应,服务器会立刻跳过那些正常情况下应该被调用的RTSP角色,然后调用对RTSP请求进行响应的模块中的RTSP Postprocessor角色。
在接收到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 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 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 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角色的模块应该按照如下方式响应客户请求:
希望自己的RTSP Request角色被调用的模块必须在其Register角色中调用QTSS_AddRole函数,并将角色的实参指定为QTSS_RTSPRequest_Role常数。第一个成功调用QTSS_AddRole a函数,并为之指定QTSS_RTSPRequest_Role角色的模块是唯一一个可以被以RTSP Request角色调用的模块。
在处理完成这个角色之后,模块通常应该返回QTSS_NoErr。
如果模块注册了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。