本文主要实现了FFmpeg的编译和移植,首先在linux下将官网下载的源码编译成.so文件,然后使用android-studio配合NDK工具,将.so文件移植到android项目当中,简单地介绍了如何一步步完成FFmpeg的编译流程
参考文章:手把手图文并茂教你用Android Studio编译FFmpeg库并移植
下面是我自己在ubuntu下编译
准备的编译工具
Git,NDK
安装git,检查本地git,git --version
直接用命令符安装: sudo apt install git
也可以去官网下载,git官网下载
如果已经有了git,想更新到最新版,可以输入 git clone https://github.com/git/git
,再进行编译安装
然后下载NDK(现在已经有13的版本了),推荐使用android studio安装ndk,下载的ndk路径默认在AndroidSDK的ndk-boudle文件中
配置NDK的环境
使用terminal配置电脑的环境,(个人电脑,我直接以管理员权限配置的系统环境变量)
sudo gedit /etc/profile
打开之后,把我们的ndk路径配置进来,
下载ffmpeg的最新的源码
新建一个ffempeg的工作文件夹,例如 mkdir workplace
git clone https://git.ffmpeg.org/ffmpeg.git
也可以直接去官网下载:ffmpeg官网下载
修改ffmpeg的configure文件
为了保证我们编译出的文件是以.so的后缀名
将文本中的3209-3212这4行:
修改改为:
编写编译脚本
写脚本的直观上的好处就是省去了一步步的执行编译命令,通常的在编译之前都需要进行配置,设置相应的环境变量,比如指定编译工具、编译平台等等,查看所有的配置选项可以在ffmpeg目录执行如下命令:
./configure –help
当然此脚本中,我们只需要设置几个我们比较关心的配置。
1. NDK的路径:
NDK=/path/to/ndk
2. 编译的ndk plaform版本:
SYSROOT=$NDK/platforms/android-23/arch-arm/
3. 交叉编译工具:
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
4. CPU平台:
CPU=arm
5. 编译完成后安装目录(当前目录下的android文件夹):
PREFIX=./android/$CPU
确定我们需要的配置之后,在ffmpeg的目录下面新建一个脚本 build4android.sh
|
|
这里增加一个方便的脚本技巧,便于修改自己的配置,我们将这些configure配置参数写进一个脚本function,建议如下语法:
另外一种一种语法(这种可能会报找不到function的错误,不推荐使用):
还有就是脚本编辑推荐使用vim非常方便,变量参数一目了然
开始编译
进入我们的FFmpeg的源码目录,执行刚才的脚本:
(先增加执行权限 sudo chmod +x build4android.sh
,以防权限不够)
./build4anroid.sh
脚本执行中:
脚本执行完成:
生成的android/arm/
目录中的文件,图中标出的为链接文件可以删除:
移植我们的.so文件
拷贝.so文件到android-studio工程文件中
在android-studio中切换成project工程目录模式,在app/src/main
目录下面新建一个jni
文件夹,将上面第6步中的include
文件夹拷贝到此文件夹中,再在jni
文件夹中新建一个lib
文件夹,将.so
文件拷贝进来,新建Android.mk
,Application.mk
和c文件目录结构如下:
|
|
编写Android.mk文件
|
|
编写Application.mk文件
|
|
编写C文件
在上面编写的Android.mk中,我们制定了c文件的名字为ffmpeg-jni.c
,所以c文件的与此保持一致,
函数申明语法:JNIEXPORT jstring Java_包名activity名函数名,包名中间的点号.
全部变成下划线_
例如:我在包名com.righere.ffmpegndkbuild
下面的MainActivity
中要使用avcodecInfo这个函数,
JNIEXPORT jstring Java_com_righere_ffmpegndkbuild_MainActivity_avcodecInfo
|
|
修改gradle(修改的是app的build.gradle
)
- 告诉gradle,
.mk
文件的路径(在android{–}里面添加):
|
|
- 告诉gradle,完成编译之后,我们的生成的
.so
文件在哪个目录下面(在android{–}里面添加):
这里我编译的armeabi
版本的生成的.so
文件自动会放在了’src/main/libs/armeabi’这个目录下面,其他的版本只需要把armeabi
名字变一下就行了
- 告诉gradle,ndk-build的时候还要执行哪些附加选项(在defaultConfig{}里面添加):
这一步其实可以看做是对.mk
文件的补充
|
|
执行ndk-build
编译完成main文件夹下会增加libs
和obj
两个文件夹,其中libs/armeabi
下就是我们需要的.so
文件
切换回Android结构的工程试图,系统会自动把生成的.so
文件放入jniLibs
中,看到这个FFmpeg的移植基本就成功了
测试FFmpeg移植
在MainActivity中添加测试代码,
|
|