【Live555】live555源码详解系列笔记
继承协作关系图 【视频|【Live555】live555源码详解(八)(testRTSPClient)】下面红色表示本博客将要介绍的testRTSPClient实现的三个类所在的位置:
ourRTSPClient、StreamClientState、DummySink
文章图片
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源码详解系列笔记
推荐阅读
- android学习|自定义进度条样式progressBar
- 视频|模糊视频帧插值(CVPR2020论文点评)
- ffmpeg|分辨率、帧率、码率关系
- 【Live555】live555源码详解(九)(ServerMediaSession、ServerMediaSubsession、live555MediaServer)
- 视频|【Live555】live555源码详解(七)(GenericMediaServer、RTSPServer、RTSPClient)
- 【Live555】live555源码详解(六)(FramedSource、RTPSource、RTPSink)