最近趁着有空将ffmpeg 2.0.1版做了次android移植,关于ffmpeg的移植文章在网上可以说是非常多了,但是在2.0.1的移植过程中还是出现了不少问题,特此记录,以备查阅。
参考文章: http://my.oschina.net/wangqin/blog/80345
个人开发环境: Linux Mint 15(X64) android-ndk-r9 (linux X86 32bit)
个人移植工程目录结构如下: ffmpeg_android 工程主目录
|--jni
|--audiocore 存放ffmpeg库测试代码
|--ffmpeg 存放ffmpgeg源码
相同的地方不再重复叙述,以免给人盗贴之嫌。 首先创建移植配置脚本preconfig.sh和各个模块的Android.mk, 内容见附件:
使用傲本前请将ndk目录安实际替换 原本想用android ndk最新的4.8 toolchain, 可视在预配置脚本执行过程中会报错,换用4.6版本的toolchain可以顺利通过。 提示错误如下(暂时未能解决): /home/mike/devtool/android-ndk-r9/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc is unable to create an executable file. C compiler test failed.
根据参考链接进行相应文件修改。
附加修改: 将libavutil/time.h改名libavutil/avtime.h
libavutil/time.c改名libavutil/avtime.c
将以下文件中的"libavutil/time.h"作相应修改
ffmpeg.c
ffplay.c ffserver.c
libavcodec/fft-test.c
libavcodec/dct-test.c
libavcodec/motion-test.c
libavformat/rtspenc.c
libavformat/utils.c
libavformat/hls.c
libavformat/sapenc.c
libavformat/rtspdec.c
libavformat/network.c
libavformat/rtpdec.c
libavformat/rtsp.c
libavformat/mux.c:37
libavformat/hlsproto.c
libavformat/ftp.c
libavformat/udp.c
libavformat/rtmphttp.c
libavformat/tcp.c
libavformat/avio.c
libavutil/avtime.c
libavutil/des.c
将libavfilter下Makefile中的如下内容删除或是注释 #clean::
#$(RM) $(CLEANSUFFIXES:%=libavfilter/libmpcodecs/%)
将以下文件中的"#include <stdlib.h>"注释(android ndk在编译时总是报错,注释后顺利通过)
libavcodec/dcahuff.h
libavcodec/put_bits.h
libavcodec/utils.c
libmpcodecs/mp_image.c
libmpcodecs/mp_image.h
libavformat/avlanguage.c
libavformat/file.c
libavformat/mux.c
libavformat/rpl.c
libavutil/avassert.h
libavutil/common.h
libavutil/log.c
libavutil/mem.c
libavutil/samplefmt.c
libavutil/timer.h
libpostproc/postprocess.c
执行预配置脚本
./preconfig.sh
修改libavutil/attributes.h
#define av_restrict restrict
改为
#define av_restrict
使用ndk-build命令编译
如果没有特殊问题,应该可以顺利完成编译。
原来的bz2压缩包无法正常解压缩,已经更新为zip包。
附件下载:
android ffmpeg makefile 压缩包