跨平台——ffmpeg移植android、cocos2dx

【版本】

ffmpeg 1.2.6, android ndk r8b,cygwin

【windows下编译】

这个比想象中的简单,用MinGW编译,然后在VS里用生成的lib库即可,参照下列网友的博客:

windows下编译ffmpeg

【配置编译】

安装好cygwin,把android ndk放到cygwin的home目录下面,路径是这样:D:\cocos2dx\cygwin\home\Administrator\android-ndk-r8b

然后解压ffmpeg到这个地方(jni里就是内容):D:\cocos2dx\cygwin\home\Administrator\ffmpeg\jni\ffmpeg


然后编写配置脚本config.sh,这部分可参考下面的链接:

编写ffmpeg的config.sh脚本

内容如下(注意最后把configure的内容放一行,这是一个坑哦!而且如果ndk路径不一样的自己改下):

./configure  --disable-asm --disable-static --enable-shared --enable-gpl --enable-version3 --enable-nonfree --disable-doc --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --disable-avdevice --disable-avfilter --disable-postproc --enable-small --cross-prefix=/home/Administrator/android-ndk-r8b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi- --enable-cross-compile  --target-os=linux --extra-cflags=‘-I/home/Administrator/android-ndk-r8b/platforms/android-9/arch-arm/usr/include‘ --extra-ldflags=‘-L/home/Administrator/android-ndk-r8b/platforms/android-9/arch-arm/usr/lib -nostdlib‘ --arch=arm --disable-symver --disable-debug --disable-stripping
sed -i ‘s/HAVE_LRINT 0/HAVE_LRINT 1/g‘ config.h
sed -i ‘s/HAVE_LRINTF 0/HAVE_LRINTF 1/g‘ config.h
sed -i ‘s/HAVE_ROUND 0/HAVE_ROUND 1/g‘ config.h
sed -i ‘s/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g‘ config.h
sed -i ‘s/HAVE_TRUNC 0/HAVE_TRUNC 1/g‘ config.h
sed -i ‘s/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g‘ config.h

然后把这个脚本拷贝到上面的jni目录下,运行cygwin到jni目录去执行这个脚本:

cd /home/Administrator/ffmpeg/jni

export TMPDIR=d:/temp

./config.sh

第二句是设置临时目录,这也是一个坑,而且这个目录要存在吧。然后第三句就开始执行配置脚本,出现下面这样就对了……


【编写Android.mk】

我就不仔细说了,我也是参考其他博客的,我也就不详细讲了,很多坑也包含在里面了。你只要下载并拷贝到你刚才ffmpeg目录相应的位置就行了(注意里面的config.sh有点改动,以上面博客的为准,而且上面讲了 这里不用管那个config.sh)。

Android.mks

【漫长编译路-第一季】

错误和坑都比较多,大家做好心理准备。先改一些地方吧:

1.修改jni/ffmpeg下的config.h,修改这两行成这样:

#define CC_IDENT "gcc 4.4.3(GCC)"
#define av_restrict// restrict
2.修改libavcode libavformat libavutil libswscale目录下的Makefile,将其中的include XXXXconfig.mak去掉

3.修改libavutil/libm.h,将其中的static方法都删除掉

然后就可以把ndk目录设置到环境变量path里去,就可在cygwin中cd到最外面的那个ffmpeg目录开始第一波尝试了,执行ndk-build

【漫长编译路-第二季】

1.哦,对了ndk可能还会有些问题,你只要找到ndk里对应文件对应的行数,一般是注释或删除掉那行就行了。这个我就不去再弄一次了。

本来编译的坑还是很多的,可能都在上面的配置文件中被我改掉了,所以现在看着很轻松的样子。

2.libavutil下的time.h重名问题,将该目录的time.h改名为avtime.h,然后将所有用到libavutil/time.h的c文件都改为libavutil/avtime.h(去目录设置搜索条件搜索文件修改呗)。

3.链接的时候说ff_log2_tab重定义了,将libavformat和libavcodec下的makefile里log2_tab.o删除呗,然后删除临时文件再编译下。

见到下图就大功告成了:


如果我描述得不清楚的话,可以参考下这篇博客,我也是写这个的时候才发现,真是后悔没早点找到:

http://blog.csdn.net/xms0xms/article/details/8964999

【在cocos2dx中使用】

这里只说最简单的方式啊,把ffmpeg整个拷贝到cocos2d-x-2.2.1\cocos2dx下,因为引擎缺省build_native.sh里配置了这个导入目录。然后修改Android.mk加上下面这些话:

LOCAL_WHOLE_STATIC_LIBRARIES += libavformat 
LOCAL_WHOLE_STATIC_LIBRARIES += libavcodec
LOCAL_WHOLE_STATIC_LIBRARIES += libavutil
LOCAL_WHOLE_STATIC_LIBRARIES += libswscale

include $(BUILD_SHARED_LIBRARY)

$(call import-module,cocos2dx)
$(call import-module,cocos2dx/platform/third_party/android/prebuilt/libcurl)
$(call import-module,CocosDenshion/android)
$(call import-module,extensions)

$(call import-module,cocos2dx/ffmpeg/jni/ffmpeg/libavformat)
$(call import-module,cocos2dx/ffmpeg/jni/ffmpeg/libavcodec)
$(call import-module,cocos2dx/ffmpeg/jni/ffmpeg/libavutil)
$(call import-module,cocos2dx/ffmpeg/jni/ffmpeg/libswscale)

应该就能用了,而怎么用的话,可以参考下面这个大大写的文文,也可用来移植ios:

http://blog.csdn.net/langresser_king/article/details/14516879

注意:在android下要将播放的视频文件拷贝到可写目录(且目录必须存在)去,不然会打开错误的,谨记……

跨平台——ffmpeg移植android、cocos2dx,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。