这篇我们来学习实践ffmpeg的交叉编译,其中会涉及到ffmpeg的版本、NDK的版本、编译脚本的编写、Gradler ABI处理 以及 CMakeLists.txt的针对不同ndk版本脚步的编写
在交叉编译的时候由于平台差异性大,需要工具来解决这一问题,就出现了各种工具链,即Toolchains。而NDK提供了交叉编译的一整套工具的集合,不同版本和配置会有不同差异,很容易就会出现各种问题,是一个不断折腾的过程,),本文记录学习实践的过程,ffmpeg3.3.9+ndk16,以及ffmpeg4.3.1或者ffmpeg4.2.4+ndk21 欢迎交流讨论。
一、配置安装android交叉编译工具链
-
下载NDK
NDK有很多版本 14,16,21等等,我们该选择什么版本比较好呐?
现在一般都选用16以上的,16时编译工具链做了不少变化。而不同的ffmpeg版本支持的NDK版本也不同,比如,ffmpeg3.x的版本使用android-ndk-r16b,但是ffmpeg4.x的版本使用16就编译不过,这里选用的是android-ndk-r21e. -
配置NDK环境
android-ndk-r21e
配置环境变量
vim ~/.bash_profile
export NDK_PATH=/Users/xxx/tools/android-ndk-r21e
export PATH=${PATH}:$NDK_PATH
编辑保存好之后执行下下面语句使之生效
. ~/.bash_profile
-
安装android交叉编译工具链(也可省略)
/Users/xxx/tools/android-ndk-r 21e/build/tools路径下有make-standalone-toolchain.sh和make_standalone_toolchain.py,我们使用py版本来配置android交叉编译工具链
用到make_standalone_toolchain.py
先创建交叉编译工具链输出的路径
/Users/xxx/tools/android-ndk-r21e/android-toolchains/android-19
mkdir android-toolchains
cd android-toolchains
mkdir android-19
cd android-19
with open(src, 'rb') as fsrc:
到android-ndk-r16b/build/tools
下执行
sudo ./make_standalone_toolchain.py --arch arm --api 19 --install-dir ../../android-toolchains/android-19/arm-arch
这个步骤相当于把配置的arch和api等相关信息在指定文件夹下面做个copy(个人理解),方便后续编写ffmpeg编译脚本时用指定toolchain。
之所以说这个步骤可以省略,是因为,也可以直接在后续编写ffmpeg编译脚本中指定不同ABI和API对应的toolchain路径。
二、手写FFmpeg编译脚本 进行编译(针对ffmpeg3.x和ffmpeg4.x版本)
下载ffmpeg
不同的ffmpeg版本使用编译时需要的ndk版本也会有不同,如果在上一步下载配置的NDK是16,则下载3.x的ffmpeg。如果NDK是21,则下载4.x的ffmpeg。
这个编译的过程折腾了自己两三天的时间,为了搞清楚原因,避免后续踩坑,针对ffmpeg3.x和ffmpeg4.x都进行记录。
我们先来看下编译第三方库的一般通用步骤
-
看READMME.md
-
编译项目需要Makefile,如果有尝试使用make编译,如果没有,需要写makefile或者cmake构建
-
如果报错需要解决,一般都是Makefile的一些配置文件没有生成,运行下configure
-
生成配置文件后,再次运行make,但是编译后的文件(elf,so,a)只能在当前系统下运行。
-
如果需要需要跑到android或者ios需要交叉编译
-
需要给configure传一些脚本编译参数(关键!)
关注+后台私信我,领取2022最新最全学习提升资料包《Andoird音视频开发必备手册+音视频最新学习视频+大厂面试真题+项目实战源码讲义》资料内容包括(C/C++,Linux,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,