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可以运行在线程中,并且可以启动和停止了。




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Android 平台上编译 Live555 需要进行以下几个步骤: 1. 下载 Live555 的源码 可以从 Live555 的官网下载源码包,也可以从 GitHub 上下载。 2. 配置交叉编译环境 由于 Live555 是一个 C++ 库,需要使用交叉编译工具链进行编译。你需要下载并安装 Android NDK,并设置好环境变量。 3. 修改 Live555 的配置文件 进入 Live555 的源码目录,找到 `config.Android` 文件,将其中的变量设置为 Android 平台的交叉编译工具链路径和库路径。例如: ``` ANDROID_NDK=/path/to/android-ndk ANDROID_SDK=/path/to/android-sdk ANDROID_API=android-21 ANDROID_ARCH=arch-arm ANDROID_TOOLCHAIN=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 ANDROID_LIB=$ANDROID_NDK/platforms/$ANDROID_API/$ANDROID_ARCH/usr/lib ``` 4. 编译 Live555 库 在命令行中执行以下命令进行编译: ``` ./genMakefiles android make ``` 编译完成后,会生成一个 `live` 目录,其中包含了编译好的库文件和头文件。 5. 将 Live555 库集成到 Android 项目中 将 `live` 目录下的库文件和头文件拷贝到 Android 项目的 jni 目录下,并在 Android.mk 文件中添加以下内容: ``` LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := live555 LOCAL_SRC_FILES := libliveMedia.a libBasicUsageEnvironment.a libgroupsock.a libUsageEnvironment.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_STATIC_LIBRARY) ``` 其中,`LOCAL_SRC_FILES` 指定编译好的库文件,`LOCAL_EXPORT_C_INCLUDES` 指定头文件路径。然后在需要使用 Live555 的代码中引用 `live555` 模块即可。 以上就是在 Android 平台上编译 Live555 的基本步骤。由于 Live555 的配置比较复杂,如果遇到问题可以参考 Live555 的官方文档或者在社区中寻求帮助。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值