1、分别的含义
SETUP:告知服务器以TCP/UDP建立RTP、RTSP连接,并告知端口号
PLAY:告知服务器可以开始用RTP协议传输数据过来了
PAUSE:暂停
TEARDOWN:关闭连接
2、
在服务器程序端,有一个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是怎么做的
3、handleCmd_SETUP
1、服务器首先找到客户端请求的ServerMediaSession,在进一步找到ServerMediaSubsession,
2、从客户端的请求中获取信息(也就是客户端的RTP、RTCP端口)
3、最后调用OnDemandServerMediaSubsession::getStreamParameters创建RTP/RTCP连接
4、
至此,服务器和客户端之间已经建立好连接了,就等客户端PLAY信号,就可以开始传RTP包了
5、handleCmd_PLAY
若是收到客户端的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)
6、网上高人的总结:
服务器通过RTPSink去读数据,在RTPSink中又通过FramedSource读数据(这里应该是将媒体文件 流化)读完数据后交给RTPSink处理,RTPSink处理完后又继续通过FramedSource去读数据,如此在RTPSink和FramedSource之间形成循环,这为live555读取数据的基本流程
7、PAUSE TEARDOWN
这两个请求暂没有去研究