开始分析MediaServer源码前,结合官方文档说明,对各文件夹源码总结如下:
groupsock
静态库,封装了network interfaces和sockets。举例而言,Groupsock类中封装了一个收发组播数据包的socket。liveMedia
静态库,定义了一系列类簇,根类为Medium,这些类支持了多种媒体类型和编解码器。WindowsAudioInputDevice
静态库,实现了liveMedia中的AudioInputDevice虚基类,可为Windows程序提供从输入设备中读取PCM audio samples的功能。UsageEnvironment
静态库,内部主要有如下几个虚基类:- TaskScheduler
为DelayedTask、socket后台操作处理、事件event提供调度支持 - HashTable
定义通用hash表的接口,供其他代码使用 - UsageEnvironment
集成TaskScheduler、groupsock、liveMedia等模块功能,添加Result、Error消息机制,从而提供使用环境。
- TaskScheduler
BasicUsageEnvironment
静态库,由于UsageEnvironment中仅给出虚基类定义,为了能够真正地运行,所以从UsageEnvironment继承并实现了BasicUsageEnvironment类。它用于实现易用的命令行程序,其中,Read events和delayed operations通过select()循环进行支持。mediaServer
可执行文件,通过逻辑集成上述库所提供的的功能,提供串流服务。
MediaServer
MeidaServer运行效果如图所示:
面对一个庞大的项目工程,想要分析源码,必须先找出有效突破口,本文中将从live555MediaServer.cpp 中main()函数开始切割工程。
1. main()
main()函数并不复杂,下面列出整理后的源码:
int main(int argc, char **argv)
{
// 准备使用环境
TaskScheduler* scheduler = BasicTaskScheduler::createNew();
UsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler);
// RTSP Server授权控制,默认关闭. 如需开启,按如下步骤:
// 1. define ACCESS_CONTROL
// 2. authDB->addUserRecord("xxxx", "xxxx");
UserAuthenticationDatabase* authDB = NULL;
#ifdef ACCESS_CONTROL
authDB = new UserAuthenticationDatabase;
authDB->addUserRecord("username1", "password1");
#endif
// 创建RTSPServer,默认使用554端口,如已被占用或其他错误,则尝试使用8554端口
RTSPServer* rtspServer;
portNumBits rtspServerPortNum = 554;
rtspServer = DynamicRTSPServer::createNew(*env, rtspServerPortNum, authDB);
if(rtspServer == NULL)
{
rtspServerPortNum = 8554;
rtspServer = DynamicRTSPServer::createNew(*env, rtspServerPortNum, authDB);
}
if(rtspServer == NULL)
{
*env << "Failed to create RTSP server: " <<