游戏搭建吧 关注:2,476贴子:18,142
  • 1回复贴,共1

RTSP服务器处理客户端点播的基本流程

只看楼主收藏回复

处理连接请求的基本流程:
Step 1:与客户端建立RTSP连接(调用incomingConnectionHandler方法),创建ClientSession并关联fClientSocket与incomingRequestHandler(调用incomingConnectionHandler1)。
Step 2:接收客户端请求(调用incomingRequestHandler方法)。
Step 3:从客户端Socket读取数据,并对请求数据(即the request string)进行转换(调用parseRTSPRequestString方法,该方法在RTSPCommon类中)。
Step 4:根据分离出来的指令进行分别处理:
n OPTIONS→handleCmd_OPTIONS
n DESCRIBE→handleCmd_DESCRIBE
handleCmd_DESCRIBE这一个方法比较重要,首先根据urlSuffix查找ServerMediaSession是否存在(调用lookupServerMediaSession方法,该方法中通过HashTable来查找)。
在testOnDemandRTSPServer项目工程中,仅仅是通过streamName来确认session是否为NULL。而在完整的live555MediaServer项目工程中,则是通过DynamicRTSPServer类来处理,其首先是查找文件是否存在,若文件不存在,则判断ServerMediaSession(即smsExists)是否存在,如果存在则将其remove(调用removeServerMediaSession方法);若文件存在,则根据文件名创建一个ServerMediaSession(调用createNewSMS方法,若在该方法中找不到对应的文件扩展名,则将返回NULL)。
如果通过lookupServerMediaSession返回的是NULL,则向客户端发送响应消息并将fSessionIsActive置为FALSE;否则,为该session组装一个SDP描述信息(调用generateSDPDescription方法,该方法在ServerMediaSession类中),组装完成后,生成一个RTSP URL(调用rtspURL方法,该方法在RTSPServer类中)。
SETUP→handleCmd_SETUP
handleCmd_SETUP方法中,有两个关键的名词,一个是urlPreSuffix,代表了session name(即stream name);一个是urlSuffix,代表了subsession name(即track name),后面经常用到的streamName和trackId分别与这两个名词有关。
接下来会创建session's state,包括incrementReferenceCount等。紧接着,会针对确定的subsession(track)查找相应的信息。接着,在request string查找一个"Transport:" header,目的是为了从中提取客户端请求的一些参数(调用parseTransportHeader方法,该方法在RTSPServer类中),如clientsDestinationAddressStr、ClientRTPPortNum等。
再接着是getStreamParameters(该方法在ServerMediaSession类中被定义为纯虚函数并在OnDemandServerMediaSubsession类中被重定义),然后通过fIsMulticast和streamingMode来组装不同的响应消息。
PLAY→handleCmd_PLAY:处理播放请求,具体的实现流程请参见后面的步骤。
PAUSE→handleCmd_PAUSE:处理暂停请求,在执行了该请求后,最终会调用StopPlaying方法,并将fAreCurrentlyPlaying置为FALSE。
TEARDOWN→handleCmd_TEARDOWN:处理停止请求,将fSessionIsActive置为FALSE。
GET_PARAMETER→handleCmd_GET_PARAMETER:该方法主要是维持客户端与服务器通信的生存状态,just for keep alive。
SET_PARAMETER→handleCmd_SET_PARAMETER:该方法未针对SET_PARAMETER作实现,使用该方法会调用handleCmd_notSupported方法,并将最终引发与客户端断开连接。
Step 5:根据Step 4的不同指令进行消息响应(调用send方法),该消息响应是即时的。
Step 6:处理客户端发送“SETUP”指令后即开始播放的特殊情况。
Step 7:将RequestBuffer进行重置,以便于为之后到来的请求做好准备。
Step 8:检查fSessionIsActive是否为FALSE,如果是则删除当前的ClientSession。TG:li9047


1楼2022-01-11 14:33回复
    老板需要paas laas saas软件吗 软件一套齐全加我微信 yyds1-99


    2楼2022-03-02 17:35
    回复