Live555在Android下改造

        Live555是一个为流媒体提供解决方案的跨平台的C++开源项目,具体就不做介绍了。从它提供的例子程序来看,都是运行后就不再退出,在实际工作中把它移到Android下做为流媒体服务器运行(TS数据流通过RTSP发送),但是需要根据WIFI状态的变化来加载和退出,退出的时候还需要保证申请的资源都被释放。为此深入研究了一番代码实现这个目的。

        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;
}

经过这番改造后,live555可以运行在线程中,并且可以启动和停止了。




评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值