live555搭建流媒体服务器2--live555源码分析
来源:互联网 发布:centos下忘记root密码 编辑:程序博客网 时间:2024/05/21 14:18
Live555搭建流媒体服务器2--Live源码分析
1. Live555源码概述
从主页上得到的Live555源码(详见博客《Live555搭建流媒体服务器1--概述》)包括四个基本的库,BasicUsageEnvironment库,UsageEnvironment库,groupsock库,liveMedia库;以及两个应用mediaServer和proxyServer;和各种测试代码testProgs。
2. UsageEnvironment库和BasicUsageEnvironment库
UsageEnvironment库包含三个类: UsageEnvironment类、TaskSchedule类、HashTable类;UsageEnvironment类主要用于消息的输入输出和用户交互功能,也就是说代表了整个系统运行的环境,提供了错误记录和错误报告的功能,无论哪一个类要输出错误,就需要保存UsageEnvironment 的指针。TaskSchedule类实现事件的异步处理、事件处理函数的注册等,提供了任务调度功能,整个程序的运行发动机就是它,它调度任务,执行任务(任务就是一个函数)。其中UsageEnvironment类的成员变量中包含TaskSchedule类型的成员,即:
TaskScheduler& fScheduler;
这是因为TaskScheduler 类在全局中只有一个,所以保存在UsageEnvironment中。而所有的类又都保存了UsageEnvironment类的指针,所以谁想把自己的任务加入调度中,就可以很容易做到。
UsageEnvironment类的构造函数也要用到TaskSchedule类型的成员,即:
UsageEnvironment(TaskScheduler& scheduler); // abstract base class
TaskSchedule类通过维护一个异步读取源实现对诸如通信消息到达等事件的处理,通过使用DelayQueue实现对其他注册函数的延时调度,这些后面用到再做研究,主要的是TaskSchedule类的一个虚函数:
virtual void doEventLoop(char* watchVariable = NULL) = 0;
// Causes further execution to take place within the event loop.
// Delayed tasks, background I/O handling, and other events are handled, sequentially (as a single thread of control).
// (If "watchVariable" is not NULL, then we return from this routine when *watchVariable != 0)
一般代码都有着三句话:
TaskScheduler* scheduler = BasicTaskScheduler::createNew();//创建任务调用器
UsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler); //创建交互环境
env->taskScheduler().doEventLoop();//进行事件循环
HashTable类定义了一个Hash表,其它代码要用到这个表。程序设计者通过自定义该抽象了类UsageEnvironment和TaskScheduler类的子类,就可以在特定环境(如GUI环境)中运行,不需要进行过多的修改。
BasicUsageEnvironment库是UsageEnvironment的一个控制台应用程序的实现,利用select()函数实现事件获取和处理,针对Unix或者Windows的控制台输入输出和信号响应进行具体实现,可用于调试,开发传统的运行与控制台应用。主要包含以下类:BasicUsageEnvironment0类、BasicTaskScheduler0类,这两个直接继承于UsageEnvironment类、TaskSchedule类;BasicUsageEnvironment类、BasicTaskScheduler类,这两个继承于BasicUsageEnvironment0类、BasicTaskScheduler0类;为什么不直接继承于UsageEnvironment类、TaskSchedule类还没做研究,望研究过的大神指点。然后就是HandlerSet类、HandlerDescriptor类、HandlerIterator类、BasicHashTable类、Timeval类,用于事件调度的一些辅助类吧。这里主要是SingleStep()函数,在BasicUsageEnvironment0类中定义的是:
virtual void SingleStep(unsigned maxDelayTime = 0) = 0;
// "maxDelayTime" is in microseconds. It allows a subclass to impose a limit
// on how long "select()" can delay, in case it wants to also do polling.
// 0 (the default value) means: There's no maximum; just look at the delay queue
// "maxDelayTime" is in microseconds. It allows a subclass to impose a limit
// on how long "select()" can delay, in case it wants to also do polling.
// 0 (the default value) means: There's no maximum; just look at the delay queue
在BasicUsageEnvironment类中进行了虚函数的重写:
virtual void SingleStep(unsigned maxDelayTime);
而之前env->taskScheduler().doEventLoop();//进行事件循环 ,函数体中是执行了SingleStep()函数的:
void BasicTaskScheduler0::doEventLoop(char* watchVariable) { // Repeatedly loop, handling readble sockets and timed events: while (1) { if (watchVariable != NULL && *watchVariable != 0) break; SingleStep(); }}而SingleStep()函数到底执行了哪些可以参考源代码中的函数实现,简要介绍是:只是任务调度的一个方法,该方法找到最需要执行的任务并执行之。
0 0
- live555搭建流媒体服务器2--live555源码分析2
- live555搭建流媒体服务器2--live555源码分析
- live555搭建流媒体服务器1--live555概述
- Live555 流媒体服务器启动
- live555搭建简易流媒体服务
- live555搭建简易流媒体服务
- 用live555构建流媒体服务器
- live555构建流媒体服务器(1)
- live555构建流媒体服务器(1)
- live555——RTSP/RTP和live555通信详解,搭建流媒体服务器
- live555搭建rtsp服务器
- live555 源码分析
- live555 源码架构分析
- Live555源码分析:generateSDPDescription
- live555 源码分析:简介
- live555 源码分析:基础设施
- live555 源码分析:MediaSever
- live555 源码分析:RTSPServer
- C# 快速排序
- TypeError: 'dict_keys' object does not support indexing
- 第11周项目4特殊三位数
- [ArcGIS必打补丁]ArcGIS 10.2.2 for Desktop连接Oracle(2014年10月发布)数据库崩溃的问题
- 他被开发者们尊为“教父”,他从不与媒体谈论技术以外的事情。
- live555搭建流媒体服务器2--live555源码分析
- DeepLearning学习随记(一)稀疏自编码器
- Farseer.net轻量级开源框架 中级篇:DbFactory数据工厂
- Hadoop源码学习笔记(3) ——初览DataNode及学习线程
- 【领域驱动】—— 领域驱动导读
- ubuntu14.04修复启动项
- HDMI的拔插的uevent的流程
- putty登录我的linux主机 解决思路
- android 开机动画