耗时两天,昨天上午成功按网上的方法,使ffmpeg生成了10个动态连接库。经过一天的改造,现在可以只生成一个libffmpeg.so库了,后面可以直接基于这个库进行二次开发了。
开发的方法与步骤可以参考:
NDK版本android-ndk-r8e ffmpeg版本:1.2.1
重点参考:
http://blog.youkuaiyun.com/cbzhaojay/article/details/8524915 ---这个方法编译出来是一个库libffmpeg.so
http://blog.youkuaiyun.com/dyllove98/article/details/9043493 ---这种方法的配置文件会生成10个库,参照前面的网址对mk文件稍作修改后可以只生成一个库。
http://www.51testing.com/?uid-377588-action-viewspace-itemid-834412 ---遇到的问题可以参考本文
1.相关路径
NDK路径:F:\AndroidDev\android-ndk-r8e
ffmpeg-1.2.1源码的存放路径(工程名为HelloJni):F:\AppDevSoftware\HelloJni\jni\ffmpeg
config.sh中的配置路径:
export TMPDIR="F:/Temp"
PREBUILT=F:/AndroidDev/android-ndk-r8e/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows
PLATFORM=F:/AndroidDev/android-ndk-r8e/platforms/android-8/arch-arm
需要根据需要调整config.sh中的参数。
2.注释掉每个库目录下 Makefile 的第一行:include $(SUBDIR)../config.mak
如果要编译为一个so库文件,则需要进行下面的操作:
这4个目录libavcodec libavformat libswresample libavutil下的Makefile中都带有log2_tab.o,会引起重复定义,
我们将前三个目录下Makefile中都带有log2_tab.o的行删掉。
另外,在JNI根目录下的Android.mk中,也加入下面这行,否则最后的连接会失败,报inflate关键字相关的错误(就是zlib.h中的函数):
LOCAL_LDLIBS := -lz -----------该问题耗时一天才解决,网上资料有点问题。
3.执行./config.sh
可能会遇到build-binary.mk与build-all.mk的报错,将报错行注释,编译完后再改回即可。
内部调用了configure,该脚本会生成config.mak、config.h、libavutil/avconfig.h 用于后面的编译。
4.config.h文件中修改
#define av_restrict restrict
为:
#ifdef av_restrict
#undef av_restrict
#endif
#define av_restrict
删掉版本号中的乱码(这里有一个回车符)
5.打开 libavutil/parseutils.h,把 #include <time.h> 替换为 #include <sys/../time.h> --------这种方法没有成功,仍然报错。
也可以这样:
把ffmpeg/libavutil/time.h更名为avtime.h,同时修改下面文件中的引用libavutil/time.h为libavutil/avtime.h
ffmpeg/libavformat/avformat.h:211
ffmpeg/libavformat/avio.c:25
ffmpeg/libavformat/hls.c:33
ffmpeg/libavformat/mux.c:39
ffmpeg/libavformat/utils.c:40
ffmpeg/libavutil/time.c:36
6.在项目根目录下执行ndk-build,等15分钟左右即可完成编译
-------定位编译问题时,可以在ndk-build后面加入V=1参数,查看详细的编译命令。