主要参考https://blog.csdn.net/qq_38261174/article/details/83210458
主要参考的上面大神的操作,不过由于环境不一样,有些采坑点增加,我的电脑是win10系统。
一.所以我们总共需要下载的东西有:
- NDK https://developer.android.google.cn/ndk/downloads/ 版本r14
- MInGW https://sourceforge.net/projects/mingw/files/ 我们公司没有外网,手机热点网速过慢下不下来,所以我后续采用的是离线下载安装的,后面讲。
- FFMPEG源码 https://ffmpeg.org/download.html
接下来讲具体流程,如何下载?如何安装?如何配置环境变量,如何检验配置成功?最终到如何编译使用?
二.NDK配置
1.下载ndk压缩包到随便一个盘的一个文件夹,并解压缩了。
2.配置环境变量
D:\Android\android-ndk-r14b;
3.检验是否配置成功
在cmd命令行输入 ndk-build ,出现如下情况,则表示配置成功。
三.MinGW下载安装配置
1.下载
2.得到一个.exe文件(不管你放在哪),点开,然后选择安装位置。
恩,我到这里就进行不下去了,网速不给力,安装不上,所以去找离线安装方法https://blog.csdn.net/Leo_LiangXuYuan/article/details/86763735这哥们给了离线安装方法,也是好用的,但如果你用这个,那你后续会遇到没有msys.bat,缺少yasm.exe等尴尬情况,我就都遇上了,所以我把这些都下载好了整理到一起https://download.csdn.net/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/bash
make clean
export NDK=D:/Android/android-ndk-r14b
export SYSROOT=$NDK/platforms/android-14/arch-arm
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
export CPU=arm
export PREFIX=$(pwd)/android/$CPU
export 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_FLAG
make clean
make
make 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' failed
make: *** [libavdevice/alldevices.o] Error 1
解决方法:
我看网上有人说是ndk版本太高,换到14以下就好了,我也试了下,但是没解决。后来是先不修改configure文件内容编译出来带版本号的.so然后再修改configure文件内容,之后用rm -rf android命令删除android文件夹,再执行./build_android.sh才编译出来能用的版本的。
六、在androidStudio中使用.so文件,验证.so文件是否可用
直接参考这篇文章https://blog.csdn.net/qq_38261174/article/details/83273409