视频|【Live555】live555源码详解(八)(testRTSPClient)

【Live555】live555源码详解系列笔记
继承协作关系图 【视频|【Live555】live555源码详解(八)(testRTSPClient)】下面红色表示本博客将要介绍的testRTSPClient实现的三个类所在的位置:
ourRTSPClient、StreamClientState、DummySink视频|【Live555】live555源码详解(八)(testRTSPClient)
文章图片

1、流程分析 1.1 设置使用环境 创建任务调度器和使用环境

TaskScheduler* scheduler = BasicTaskScheduler::createNew(); UsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler);

1.2 打开url 使用远端rtsp的url,创建 RTSPClient,并发送命令DESCRIBE
openURL(*env, argv[0], argv[1]) --> RTSPClient* rtspClient = ourRTSPClient::createNew(env, rtspURL, RTSP_CLIENT_VERBOSITY_LEVEL, progName); rtspClient->sendDescribeCommand(continueAfterDESCRIBE);

1.3 开始播放 在任务调度器的事件循环中获取视频,并处理
env->taskScheduler().doEventLoop

1.4 回收资源
env->reclaim(); env = NULL; delete scheduler; scheduler = NULL;

2、类分析 2.1 ourRTSPClient ourRTSPClient 继承自 RTSPClient
如果只有一个流,可以定义和使用单一的“StreamClientState”结构,作为应用程序中的一个全局变量。
如果同时播放多个流,必须为每个“RTSPClient”使用单独的“StreamClientState”结构。
为此,我们子类化“RTSPClient”,并在子类中添加一个“StreamClientState”字段:
主要接口:
createNew:静态函数,用来创建ourRTSPClient

重要成员变量:
StreamClientState scs; //用来记录流状态

2.2 StreamClientState StreamClientState 通过会话MediaSession、子会话MediaSubsession来管理RTSP客户端状态。
class StreamClientState { public: StreamClientState(); virtual ~StreamClientState(); public: MediaSubsessionIterator* iter; MediaSession* session; MediaSubsession* subsession; TaskToken streamTimerTask; double duration; }

2.3 DummySink 虚拟接收器,不对接收的数据做任何操作。 DummySink 继承自 MediaSink
定义一个数据接收器(“MediaSink”的子类)来接收每个子会话的数据(例如:音频或视频“子流”)。 在实际开发中,这可能是一个类(或类链),它解码然后呈现传入的音频或视频。 或者它可能是一个“FileSink”,用于将接收到的数据输出到文件中(正如“openRTSP”应用程序所做的那样)。
在示例 testRTSPClient 中,我们定义了一个简单的“虚拟”接收器,它接收传入的数据,但不对其进行任何操作。
主要接口:
createNew:静态函数,用来创建DummySink

【Live555】live555源码详解系列笔记

    推荐阅读