【Live555】live555源码详解(八):testRTSPClient

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

继承协作关系图

下面红色表示本博客将要介绍的testRTSPClient实现的三个类所在的位置:
ourRTSPClient、StreamClientState、DummySink【Live555】live555源码详解(八):testRTSPClient_第1张图片

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源码详解系列笔记

你可能感兴趣的:(视频,live555)