SETUP:告知服务器以TCP/UDP建立RTP、RTSP连接,并告知端口号 PLAY:告知服务器可以开始用RTP协议传输数据过来了 PAUSE:暂停 TEARDOWN:关闭连接
在服务器程序端,有一个RTSPClientSession类(该类继承在RESPServer下),用来维护和客户端之间的对话。 在RTSPClientSession类中定义了很多handleCmd_xxxxx这样的函数,就是专门用来处理对应的请求的 例如,当处理SETUP时,就会调用handleCmd_SETUP
void RTSPServer::RTSPClientSession ::handleCmd_SETUP(RTSPServer::RTSPClientConnection* ourClientConnection, char const* urlPreSuffix, char const* urlSuffix, char const* fullRequestStr)RTP的建立过程无非是这样:client告诉server自己的rtp/rtcp端口号, server建立自己的rtp/rtcp socket,然后在收到PLAY请求时向客户端发数据。
这点暂时不确定行不行: 当然在实际中,只要双方已经约定好端口号,可以省去SETUP请求 可以看一下handleCmd_SETUP是怎么做的
1、服务器首先找到客户端请求的ServerMediaSession,在进一步找到ServerMediaSubsession, 2、从客户端的请求中获取信息(也就是客户端的RTP、RTCP端口) 3、最后调用OnDemandServerMediaSubsession::getStreamParameters创建RTP/RTCP连接
至此,服务器和客户端之间已经建立好连接了,就等客户端PLAY信号,就可以开始传RTP包了
若是收到客户端的PLAY信号,handleCmd_SETUP是怎么做的呢 1、提取Scale字段(播放速度) 2、提取Rang字段(播放的起止范围) 3、然后设置好传输的参数 Scale:setStreamScale Rang:seekStream 4、设置好之后,调用startstream开始传输
void OnDemandServerMediaSubsession::startStream(unsigned clientSessionId, void* streamToken, TaskFunc* rtcpRRHandler, void* rtcpRRHandlerClientData, unsigned short& rtpSeqNum, unsigned& rtpTimestamp, ServerRequestAlternativeByteHandler* serverRequestAlternativeByteHandler, void* serverRequestAlternativeByteHandlerClientData)在函数startstream中继续调用startPlaying
void StreamState ::startPlaying(Destinations* dests, unsigned clientSessionId, TaskFunc* rtcpRRHandler, void* rtcpRRHandlerClientData, ServerRequestAlternativeByteHandler* serverRequestAlternativeByteHandler, void* serverRequestAlternativeByteHandlerClientData)在函数StreamState::startPlaying中将客户端添加到目的客户端地址中去,继续调用 MediaSink::startPlaying
//这个函数,开始rtp包的发送 Boolean MediaSink::startPlaying(MediaSource& source, afterPlayingFunc* afterFunc, void* afterClientData)服务器通过RTPSink去读数据,在RTPSink中又通过FramedSource读数据(这里应该是将媒体文件 流化)读完数据后交给RTPSink处理,RTPSink处理完后又继续通过FramedSource去读数据,如此在RTPSink和FramedSource之间形成循环,这为live555读取数据的基本流程
这两个请求暂没有去研究
