Live555的基本组件包括UsageEnvironment&TaskScheduler、groupsock、liveMedia、BasicUsageEnvironment四部分,资源的申请和释放也是围绕这四部分进行的。现以典型的例子testOnDemandRTSPServer为例进行分析。
一、资源的创建
1、usage environment
TaskScheduler* scheduler = BasicTaskScheduler::createNew(); UsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler);2、RTSP server
RTSPServer* rtspServer = RTSPServer::createNew(*env, 8554, NULL);3、MPEG-2 Transport Stream
char const* streamName = "mpeg2TransportStreamTest"; char const* inputFileName = ""; char const* indexFileName = ""; ServerMediaSession* sms = ServerMediaSession::createNew(*env, streamName, streamName, descriptionString); sms->addSubsession(<span style="font-family: Arial, Helvetica, sans-serif;">MPEG2TransportFileServerMediaSubsession</span>::createNew(*env, inputFileName, indexFileName, reuseFirstSource)); rtspServer->addServerMediaSession(sms);4、running
env->taskScheduler().doEventLoop();
经过以上四步基本步骤,RTSP server就运行起来了,并且在doEventLoop处循环,不会退出。由于所有的这些都是运行在主线程中,所以退出循环是不可能的,为此需要做两点调整:
1、使用Android下的工具类Thread,将前三点移到readyToRun函数中,第四点移到threadLoop函数中,这样就让退出循环成为可能;
2、重新实现循环的方式,在循环内插入退出标志判断,为此需要增加一个新函数:
void doMyEventLoop(BasicTaskScheduler0* Basicscheduler) { while (1) { Basicscheduler->SingleStep(); if(mRequestExit) { break; } } }利用这个函数修改第4点:
doMyEventLoop((BasicTaskScheduler0*)&env->taskScheduler());
当在其它检测线程中检测到WIFI状态断开则设置mRequestExit,这样live555所在线程就能退出了,只是资源未释放。
二、资源的释放
资源的释放是通过调试及阅读代码总结出来的(代码注释起了很大的帮助作用),所以没有什么技巧性可言。
if(rtspServer != NULL) { // STEP1, sms; // release framesource(S1) rtspServer->closeAllClientSessionsForServerMediaSession(sms); // release mediasession(S2) and mediasubsession(S3) rtspServer->removeServerMediaSession(sms); // STEP2, rtspServer(S4); Medium::close(rtspServer); rtspServer = NULL; tssms = NULL; } // STEP3, env(S5); if(env != NULL) { env->reclaim(); env = NULL; } // STEP4, scheduler(S6); if(scheduler != NULL) { delete scheduler; scheduler = NULL; }