基于移动平台的多媒体框架——移植Live555到Android上
live555是一个处理流媒体传输对c++库,再Mplayer与vlc中都有用到。我们计划将其加入到自己编写对Android上的播放器中作为流媒体模块,首先就需要将
这个库移植到Android上。
方案I:
最近在做Android上的多媒体开发,需要在Android上移植live555,因为我算是Android上多媒体开发的新手,于是在网上找各种资料,大致的做法都是:
1. 首先在官网下载live555对源码并解压。
2. 新建一个Android工程,将源码文件放到一个该工程的jni目录下,如:jni/live。
3. 新建jni/Android.mk文件作为Makefile。将需要编译对源文件加入到LOCAL_SRC_FILES变量,将需要引用对头文件加入到LOCAL_C_INCLUDES,编译过程中
会提示需要参数:-fexceptions,于是加入参数LOCAL_CPPFLAGS += -fexceptions。
内容如下:
4. 新建jni/Application.mk文件。由于live555需要引用stl,所以加入:
APP_STL := gnustl_shared
5. 运行ndk-build就可以得到live555库
补充:我已在Android上移植过ffmpeg,并且写了简单的测试程序,可以正常的调用生成的ffmpeg库文件!!!
因移植过程中还是出现了一些错误,我顺便把移植的过程写的详细点,便于他人参考。
1. 下载了live555源码,日期是12/04/04,用的ndk版本是r5b。
2.预备工作,先用标准的方法make一下,确定你的源码是可以编译过的。
01../genMakefiles linux
02.make
[plain] view plaincopy
01../genMakefiles linux
02.make
马上就看到成功的结果了,这时不要急得移植。移植是交叉编译了,咱们先不用交叉编译,用gcc编译看看会不会。
了解live555的基本结构之后就可以执行:
01.g++ BasicUsageEnvironment/*.cpp liveMedia/*.cpp mediaServer/*.cpp UsageEnvironment/*.cpp ./groupsock/*cpp -
IBasicUsageEnvironment/include -IliveMedia/include -IBasicUsageEnvironment/include -Igroupsock/include/ -IUsageEnvironment/include -
DSOCKLEN_T=socklen_t -shared -o live555.so
[plain] view plaincopy
01.g++ BasicUsageEnvironment/*.cpp liveMedia/*.cpp mediaServer/*.cpp UsageEnvironment/*.cpp ./groupsock/*cpp -
IBasicUsageEnvironment/include -IliveMedia/include -IBasicUsageEnvironment/include -Igroupsock/include/ -IUsageEnvironment/include -
DSOCKLEN_T=socklen_t -shared -o live555.so
这样在本地就生成一个so了。
3. 跟本地一样,如果你了解了ndk的用法,写个简单的mk文件就可以移植了。建工程什么的在上面说了,我就把mk文件贴出来给大家参考一下好了。为了省事
,我就建了一个Android.mk文件。写的过程就是碰到什么问题,就改改加加什么参数。(这次连Application.mk都没有加就过了。。。)
参考的Android.mk文档是:http://blog.csdn.net/baby313/article/details/7289489
不幸的是,我生成live555的时候出错了:
Compile++ thumb : live555 <= GroupEId.cpp
/home/hu/android-ndk-r7/samples/vLive//jni/./live/groupsock/GroupEId.cpp:20:23: error: GroupEId.hh: No such file or directory
/home/hu/android-ndk-r7/samples/vLive//jni/./live/groupsock/GroupEId.cpp:21:21: error: strDup.hh: No such file or directory
/home/hu/android-ndk-r7/samples/vLive//jni/./live/groupsock/GroupEId.cpp:26: error: 'Scope' has not been declared
。。。
于是上网查资料,怀疑是脚本写错了(现在发现,应该是live555版本的差异引起的),于是接着上网查资料
在苦苦查询中找到了,一个方法:
方法很简单,在live555源码中写一个Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
BasicUsageEnvironment/BasicHashTable.cpp \
BasicUsageEnvironment/BasicTaskScheduler.cpp \
BasicUsageEnvironment/BasicTaskScheduler0.cpp \
BasicUsageEnvironment/BasicUsageEnvironment.cpp \
BasicUsageEnvironment/BasicUsageEnvironment0.cpp \
BasicUsageEnvironment/DelayQueue.cpp \
UsageEnvironment/HashTable.cpp \
UsageEnvironment/UsageEnvironment.cpp \
UsageEnvironment/strDup.cpp \
groupsock/GroupsockHelper.cpp \
groupsock/GroupEId.cpp \
groupsock/inet.c \
groupsock/Groupsock.cpp \
groupsock/NetInterface.cpp \
groupsock/NetAddress.cpp \
groupsock/IOHandlers.cpp \
liveMedia/our_md5.c \
liveMedia/our_md5hl.c \
liveMedia/rtcp_from_spec.c \
liveMedia/AC3AudioRTPSink.cpp \
liveMedia/AC3AudioRTPSource.cpp \
liveMedia/AC3AudioStreamFramer.cpp \
liveMedia/ADTSAudioFileServerMediaSubsession.cpp \
liveMedia/ADTSAudioFileSource.cpp \