最近因项目开发需要,开始学习开源项目 live555 ,特别将个人的一些学习心得做一下记录,如有理解不正确之处,欢迎各位朋友指出。
首先是源码的下载,这可以从 http://www.live555.com 上下载,同时上面亦提供了相关的文档,文档虽较为粗糙,但总比找不到任何文档说明强。当然,我在学习的过程中,也从网上查找了一段时间,收获还是有一点的,其中就有诸如: RTSP 服务器实例 live555 源代码分析、 live555 源代码简介、 live555 代码解读系列、基于 live555 的 rtp-rtcp 研究等文章。
我的学习是在 VS2008 环境下进行的,要能够在 VS 环境下顺利进行,还得做相关工作。 live 开源虽说是用 C++ 写的,代码风格也非常优秀,但是其是用 makefile 文件来做的,而对未接触过 makefile 文件的我是一个问题。幸运的是在网上偶然发现了一篇介绍在 VC6 环境下编译 live 的文章,然后照着上面所说的做,磕磕碰碰,编译成功了四个库并转移到了 VS2008 环境中。更幸运的是又是偶然在网上发现了一篇介绍用 VS2008 编译 live 的文章并提供了编译后的工程下载, download ,然后就开始了相对漫长的学习过程。
从程序的结构来看, live 项目包括了四个基本库、程序入口类(在 mediaServer 中)和一些测试代码(在 testProgs 中)。四个基本库是 UsageEnvironment 、 BasicUsageEnvironment 、 groupsock 和 liveMedia 。
UsageEnvironment 包括抽象类 UsageEnvironment 和抽象类 TaskScheduler ,这两个类用于事件调度,其中包括实现了对事件的异步读取、对事件句柄的设置及对错误信息的输出等;该库中还有一个 HashTable ,这是一个通用的 HashTable ,在整个项目中都可以使用它,当然该 HashTable 也是一个抽象类。
BasicUsageEnvironment 中的类主要是对 UsageEnvironment 中对应类的实现。
groupsock ,顾名思义,用于数据包的接收和发送,其同时支持多播和单播。 groupsock 库中包括了 GroupEId 、 Groupsock 、 GroupsockHelper 、 NetAddress 、 NetInterface 等类,其中 Groupsock 类有两个构造函数,一个是“ for a source-independent multicast group ”,另一个是“ for a source-specific multicast group ”;而 GroupsockHelper 类主要用于读写 Socket 。
liveMedia 是很重要的一个库,其不仅包含了实现 RTSP Server 的类,还包含了针对不同流媒体类型(如 TS 流、 PS 流等)编码的类。在该库中,基类是 Medium ,层次关系非常清晰。在该库中,有几个很重要的类,如 RTSPServer 、 ServerMediaSession 、 RTPSink 、 RTPInterface 、 FramedSource 等。
在 http://www.live555.com 上的相关文档中提到穿透防火墙的问题,方法是开启一个 HTTP 的 tunnel ,然后我们可以在 liveMedia 库中找到一个 RTSPOverHTTPServer 的类,该类解决了这样的问题。
mediaServer 下的 live555MediaServer 提供了 main 函数, DynamicRTSPServer 继承了 RTSPServer 并重写了虚函数 lookupServerMediaSession 。
整个项目的程序结构大体上就是这样,至于其中的一些具体实现细节,还需要进一步学习研究。