android的ffmpeg库编译及简单使用

android studio 教程 | 2018-07-29 15:19

我们都知道,在ffmpeg的官网中,是提供了windows版本的开发库的,因此在windows下开发ffmpeg应用程序只需要简单地配置几个头文件及库路径,链接相关的库就可以,但是,我们发现在ffmpeg的官网中,我们没有发现现成的android版本的库。

也许你也不知道从哪里下载过了android版本的库,然后也在使用中,不幸的是,ffmpeg官方的代码更新的还是比较快的,也就是说,你的库也许使用的是比较老的版本了,而且ffmpeg也表明,随着ffmpeg的更新,老的版本不再维护,到时也许你就不得不自己编译android版本的库了。

我在网上找到自己好用的脚本,当然拿过来时,编译不顺序,也是经过修改的,下面说一下我的环境。

1、mac book pro一台,i5处理器

2、android-ndk-r10

下面贴上我的脚本:

buildall.sh

上面这个脚本是入口,用来下载编译libfdk_aac源码、最新的x264源码、最新的ffmpeg源码,里面用到一个文本替换操作sed,作用是修改ffmpeg中的configure,使得生成的库符合android平台的命名格式,当然这里最后是生成静态库的,不做此操作也是可以的。

fdk_aac_arm_build.sh

上面这个脚本用来编译armeabi架构的fdk_aac库,其它架构的类似。

x264_arm_build.sh

上面的脚本用来编译armeabi架构的x264,其它架构的类似

jianxi_ffmpeg_arm_build.sh

上面的脚本用来编译armeabi架构的ffmpeg库,生成的是静态库,最后一个ld是用来将这些静态库合并成一个libffmepg.so的库。

在笔者的验证过程中发现一个问题,编译生成x86平台的libffmpeg.so后,x86的机器竟然跑不起来,而如果不用这个libffmpeg.so的话,直接使用ffmpeg生成的几个.a库的话,就是正常的,应该是最后一个命令某些参数写错了,下面贴出一下ffmpegx86的编译脚本,也望知道原因的朋友告知一下:

本人理解应该是上面红框处给的参数哪里不正确了,导致app加载libffmpeg.so时崩溃(使用libavcodec.a libavformat libavutil.a等静态库是正常的)

编译生成好的armeabi armeabi-v7a x86静态库以及libffmpeg.so库我均已共享出来了,-9FWSfWqaqIiQ4zw

生成好了这些杂七杂八的库后就可以在apk开发中使用中,一般来说,我们会编写好Application.mk和Android.mk来指定编译,现在的android studio已经不需要使用这两个文件了,当然我们也可以让它来使用这两个文件(以达到和eclipse一样的效果)。

我们在android studio项目中的app/src/main目录中新建jni,在jni中布好如下文件:

当然了,前面也说了android studio默认是不会去编译这里的代码的,需要在app结构下的build.gradle中进行配置:

上面第一个红框用来指定生成的so最后保存的目录

第二个框用来指定ndk-build编译命令,主要是jni目录

第三个框用来启动编译任务。

下面再贴一下Application.mk和Android.mk的内容:

Application.mk:

Android.mk:

注意到上面链接的是几个.a库,没有使用动态库libffmpeg.so,是因为生成的x86平台的libffmpeg.so库直接加载崩溃,用不起来,而在armeabi和armeabi-v7a中正常,为了兼容好,这里只贴出使用.a的情况,这个x86平台下的libffmpeg.so问题还需要解决。

最后贴一下,这个库的使用示例: