主要参考/qq_38261174/article/details/83210458
主要参考的上面大神的操作,不过由于环境不一样,有些采坑点增加,我的电脑是win10系统。
一.所以我们总共需要下载的东西有:
NDK https://developer./ndk/downloads/ 版本r14MInGW /projects/mingw/files/ 我们公司没有外网,手机热点网速过慢下不下来,所以我后续采用的是离线下载安装的,后面讲。FFMPEG源码 /download.html
接下来讲具体流程,如何下载?如何安装?如何配置环境变量,如何检验配置成功?最终到如何编译使用?
二.NDK配置
1.下载ndk压缩包到随便一个盘的一个文件夹,并解压缩了。
2.配置环境变量
D:\Android\android-ndk-r14b;
3.检验是否配置成功
在cmd命令行输入 ndk-build ,出现如下情况,则表示配置成功。
三.MinGW下载安装配置
1.下载
2.得到一个.exe文件(不管你放在哪),点开,然后选择安装位置。
恩,我到这里就进行不下去了,网速不给力,安装不上,所以去找离线安装方法/Leo_LiangXuYuan/article/details/86763735这哥们给了离线安装方法,也是好用的,但如果你用这个,那你后续会遇到没有msys.bat,缺少yasm.exe等尴尬情况,我就都遇上了,所以我把这些都下载好了整理到一起/download/wozuihaole/11419501,下载后解压文件,然后分别解压里面的三个压缩包,mingw64随便放在一个目录下,将msys放到mingw64目录下,将yasm.exe放到mingw64/bin目录下
3.添加环境变量
C:\mingw64; (自己的解压保存路径)
4.验证是否配置成功
运行CMD,命令:gcc -v
四、FFMPEG源码下载,及修改configure文件,及创建build_android.sh脚本文件
1.下载,你可以点击这里下载最新版本源码
也可以点击这里下载历史版本
然后解压到随便什么文件夹里,我的放这里:D:\ffmpegSource\ffmpeg-3.3.9
2.新建一个 build_android.sh脚本文件 ,用于配置及编译使用 (名字不唯一)
3.build_android.sh脚本文件里面的内容如下:你也可以百度有其它的内容,这个不唯一,但是第一次尝试编译的时候还是建议用下面这个少走一些坑,等熟练后可以选择编译内容再重新编译。
#!/bin/bashmake cleanexport NDK=D:/Android/android-ndk-r14bexport SYSROOT=$NDK/platforms/android-14/arch-armexport TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64export CPU=armexport PREFIX=$(pwd)/android/$CPUexport ADDI_CFLAGS="-marm"./configure --target-os=linux \--prefix=$PREFIX --arch=arm \--disable-doc \--enable-shared \--disable-static \--disable-yasm \--disable-symver \--enable-gpl \--disable-ffmpeg \--disable-ffplay \--disable-ffprobe \--disable-ffserver \--disable-doc \--disable-symver \--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \--enable-cross-compile \--sysroot=$SYSROOT \--extra-cflags="-Os -fpic $ADDI_CFLAGS" \--extra-ldflags="$ADDI_LDFLAGS" \$ADDITIONAL_CONFIGURE_FLAGmake cleanmakemake install
4.打开C:\mingw64\msys\msys.bat而不是cmd.
进入到ffmpeg源码文件夹
然后输入./build_android.sh,然后回车,这里要等很久,可以放一边先干点别的,等个半个多小时也很正常,不要因为没反应而退出。
之后还有可能会出现下面的情况,不过没关系,不要动等着就好了。
5.编译完成,会在ffmpeg源码文件夹中生成一个android文件
其/android/arm/lib目录下就是保存的.so文件但是你会发现这些.so文件后面还会有些数字(实际上是一些版本号信息),这些.so文件不能直接在android上用。接下来就是改掉这些后缀,直接去掉肯定是不行的,所以继续。
6.进入ffmpeg源码文件夹,修改configure文件:
打开文件后查找build,找到有一行是:# build settings
修改下面的内容
# 原来的配置内容:SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'#替换后的内容:SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'SLIB_INSTALL_LINKS='$(SLIBNAME)'
7.删除之前的android文件夹,然后重复第4步就好了。删除android文件夹的时候用命令行:rm -rf android
五、常见错误
1.错误1少文件
makefile:2: ffbuild/config.mak: no such file or directory
解决方法:
先不要执行make和make install,第一步先在ffmpeg-4.1下执行./configure,该命令会自动生成缺少的文件。如果你用的是我的提供的方法是不会遇到这个问题的,因为build_android.sh文件中已经都帮你写好了,不用你一行行的敲命令行。
2.错误2
../libavutil/libm.h:62: error: static declaration of 'lrint' follows non-static declaration../libavutil/libm.h:69: error: static declaration of 'lrintf' follows non-static declaration../libavutil/libm.h:76: error: static declaration of 'round' follows non-static declaration../libavutil/libm.h:83: error: static declaration of 'roundf' follows non-static declaration./libavutil/libm.h:90: error: static declaration of 'truncf' follows non-static declaration
解决方法:
config.h搜索lrint、lrintf、round、roundf等对应的字符
#define HAVE_LLRINT 1#define HAVE_LLRINTF 1#define HAVE_LRINT 1#define HAVE_LRINTF 1#define HAVE_ROUND 1#define HAVE_ROUNDF 1
将对应的值改为1即可
3.错误3
ffmpeg yasm not found, use --disable-yasm
解决方法:
下载yasm
,重命名为yasm.exe
,放到MinGW\bin
目录下
4.错误4
libavformat/os_support.c: In function 'ff_gai_strerror':libavformat/os_support.c:194:10: error: 'ERROR_NOT_ENOUGH_MEMORY' undeclared (first use in this function)
解决方法:
打开libavformat/os_support.h
文件,在其中增加#include <winerror.h>
5.错误5
ffbuild/common.mak:60: recipe for target 'libavdevice/alldevices.o' failedmake: *** [libavdevice/alldevices.o] Error 1
解决方法:
我看网上有人说是ndk版本太高,换到14以下就好了,我也试了下,但是没解决。后来是先不修改configure文件内容编译出来带版本号的.so然后再修改configure文件内容,之后用rm -rf android命令删除android文件夹,再执行./build_android.sh才编译出来能用的版本的。
六、在androidStudio中使用.so文件,验证.so文件是否可用
直接参考这篇文章/qq_38261174/article/details/83273409