live555之openRTSP-----流程分析

流程分析也可参照 http://blog.csdn.net/xu_fu/article/details/9318905 ,这篇博客的排版很清晰。
下面是我自己总结的内容:(我这个rtsp客户端实现结果,不是获取视频保存到本地文件,而是直接解码播放)

int main(int argc,char *argv[]){
    BasicTaskschedular::createNew();
    BasicUsageEnvironment::createNew();//创建BasicUsageEnvironment对象,该对象包含任务调度,和打印等基础功能
    .........................
    ourClient = createClient(*env, streamURL, verbosityLevel, progName);//streamURL是rtsp的url,progName是保存文件的名字,我随便填的
    if (sendOptionsRequest) {
   
   //开始与sever通过RTSP协商,从这里开始。下面在详细讲解
    getOptions(continueAfterOPTIONS);//第一次会执行这个函数
  } else {
    continueAfterOPTIONS(NULL, 0, NULL);
  }
    env->taskScheduler().doEventLoop(&chrEventLoopFlag); //  启动任务引擎,会不停歇的检测有没有要处理的任务。
}

现在来解析getOptions(continueAfterOPTIONS);

getOptions(continueAfterOPTIONS);
      |---sendOptionsCommand(afterFunc, ourAuthenticator);//1
.........|---sendRequest(new..RequestRecord(++fCSeq,"OPTIONS",responseHandler));//2
.................|---openConnection();//3
.........................|---connectToServer()//4
..................................|---connect()//5
..................................|---taskScheduler().setBackgroundHandling(connectionHandler);//6
.........................|---taskScheduler().setBackgroundHandling(incomingDataHandler);//7
.................|---send(fOutputSocketNum, cmd, strlen(cmd), 0)//8
.................|---fRequestsAwaitingResponse.enqueue(request);//9

2:RTSP第一步,发送OPTIONS包。并将continueAfterOPTIONS回调函数一同传入,通过这些参数构建一个RequestRecord对象,这些传入的参数通过这个对象管理
3:第一次使用RTSP协议首先要建立一个TCP连接, fInputSocketNum = fOutputSocketNum = setupStreamSocket(envir(), 0);先建立socket,然后调用4 connect连接。因为这个套接字并不是阻塞的,所以connect之后可能握手还没有完成就返回了。所以这是要添加connectionHandler到任务中,完成connect操作,一次就好。7:建立完成之后将接受消息处理函数添加到后台任务中。incomin–Data–Handler
8:前期准备都做好了然后发送OPTIONS命令,等待sever返回,
9:将开始生成的RequestRecord对象添加到等待队列中,其中包含了“OPTIONS”和处理函数“continueAfterXXXXX”

注:在发送OPTIONS时建立好了TCP连接,并添加好了处理函数
然后程序会进入singleEvent()循环,检查任务。
当检测到该socket有可读信息时,调用incomingDataHandler

  int bytesRead = readSocket(...);
  handleResponseBytes(bytesRead);

在handleResponseBytes中先解析返回的信息,然后取出 fRequestsAwaitingResponse队列里的RequestRecord对象,上面已经说了,该对象保存了接受完OPTIONS之后的处理函数continueAfterOPTIONS。
然后进入 foundRequest->handler()

然后依次类推;在continueAfterOPTIONS-》 getSDPDescription(continueAfterDESCRIBE);
然后接受DESCRIBE之后进入continueAfterDESCRIBE-》setupStreams-》setupSubsession(continueAfterSETUP);
然后接受SETUP返回之后进入continueAfterSETUP-》setupStreams-》startPlayingSession(continueAfterPLAY);

经过上面完整的过程RTSP协议client–sever之间就已经协商好了。剩下的就是接受rtp/rtcp了。

因为接受OPTIONS之后并没有太多的其他初始化,所以 下一篇在讲一下接收到DESCRIBE之后的其他的一些初始化操作。

猜你喜欢

转载自blog.csdn.net/sstya/article/details/52382828
今日推荐