live555是国内视频项目开发经常会用到的一个开源项目,该项目体积小巧,功能全面,尤其适合移植到嵌入式平台。可惜的是的相关文档太少,除了mail list 和faq之外几无可寻,几天前刚好有个项目需要用到livemedia库,于是笔者花了几个天时间把livemedia的主要部分做了点分析。不足之处,希望有兴趣的朋友补充。
整体框架
先简单介绍下live555,项目分为两个大部分:
- 底层livemedia库;提供各种功能实现,包括视频文件读写,rtsp协议,rtp协议,等等。
- 基于livemedia开发的几个应用,包括rtsp服务器live555 media server,接收视频的客户端openrtsp,playsip等。
可以看出livemedia库是各种应用的基础,其内部由各种class组成,结构庞杂。我们先分析它的基本框架:livemedia与一般类库区别最大的一点,就是它的运行结构,整个运行过程就是一个消息循环,类似窗口机制。不同的是它采用select()循环处理socket读写和各种定时任务、触发任务。下面即是内部循环的代码:
void BasicTaskScheduler0::doEventLoop(char* watchVariable) {
// Repeatedly loop, handling readble sockets and timed events:
while (1) {
if (watchVariable != NULL && *watchVariable != 0) break;
SingleStep();
}
}
可以看出,watchVariable是用户设置的循环退出条件ÿ