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

原创 2016年08月31日 11:58:46

流程分析也可参照 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之后的其他的一些初始化操作。

相关文章推荐

流媒体Live555(五)——openRTSP流程分析

openRTSP是对RTSPClient的实现,与服务器对应的客户端功能 1、初始化 BasicTaskschedular::createNew() BasicUsageEnvironment:...
  • xu_fu
  • xu_fu
  • 2013年07月13日 15:34
  • 6185

live555简介、整体框架 、openRTSP客户端流程

live555简介 Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP、RTSP、SIP等的支持。Live555实现了对多种音视频编码...

[RTSP]live555-openRTSP客户端流程

1、创建TaskScheduler和BasicUsageEnvironment类; 2、命令行解析,获取流媒体地址和其他选项; 3、创建RTSPClient对象; 4、如果需要,RTSPClie...
  • faihung
  • faihung
  • 2017年06月03日 07:21
  • 435

live555 分析—— OpenRtsp

通过分析live库提供的例子程序 OpenRTSP,可以清晰地了解客户端接收来自网络上媒体数据的过程。注意,RTP协议和RTCP协议接收的数据分别是视音频数据和发送/接收状况的相关信息,其中,RTP协...

live555 分析- openRtsp

通过分析live库提供的例子程序 OpenRTSP,可以清晰地了解客户端接收来自网络上媒体数据的过程。注意,RTP协议和RTCP协议接收的数据分别是视音频数据和发送/接收状况的相关信息,其中,RTP协...

live555中openRTSP用法

openRTSP openRTSP是一个命令行程序,它sk

庖丁解牛-----Live555源码彻底解密(根据OpenRTSP讲解)

OpenRtsp中写H264文件注意的地方:   1)接受buffer保存到文件 void H264VideoFileSink::afterGettingFrame(unsigned frameSi...

live555 接收rtsp视频流流程分析

live555 接收rtsp视频流流程分析 RTSP交互流程 C表示RTSP客户端,S表示RTSP服务端 ① C->S: OPTION request            //询问...

live555库的rtsp服务器源码分析总结,流程详解RTSPServer .

1. RTSP连接的建立过程       RTSPServer类用于构建一个RTSP服务器,该类同时在其内部定义了一个RTSPClientSession类,用于处理单独的客户会话。    ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:live555之openRTSP-----流程分析
举报原因:
原因补充:

(最多只允许输入30个字)