live555源代码学习(处理SETUP PLAY PAUSE TEARDOWN等过程)

    xiaoxiao2022-07-04  252

    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

    这两个请求暂没有去研究

    最新回复(0)