参考链接:王英豪大神 王英豪大神系列博客
网上查到的都是arm版本的,但是我们项目中使用的是x86_64的,编译整理完保存一下,给大家提供方便,本文编译的ffmpeg源码是3.2.12,文章末尾有编译好的库及源码(3.2.12与3.4.2),但3.2.12版本似乎使用有bug,不知道是否是我使用不当,使用3.2.12版本的动态库推流时会有卡顿,将库替换成3.4.2版本问题解决。
运行环境:centos7.2 i7-6700
ndk版本:android-ndk-r14b
下载好ndk。
开始:
一、安装ndk,顺序执行
1. cd /usr/local
2. mkdir android
3. cd android
4. mkdir ndk
5. cd ndk
将安装包拷贝过来,解压到当前文件夹
unzip android-ndk-r14b-linux-x86_64.zip
修改/etc/profile文件,
vi /etc/profile 追加:
export ANDROID_NDK_HOME=/usr/local/android/ndk/android-ndk-r14b
export PATH=$ANDROID_NDK_HOME:$PATH
source /etc/profile
执行 ndk-build (终端输入此命令即可)
出现下面提示代表成功
Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
/usr/local/android/ndk/android-ndk-r14b/build/core/build-local.mk:151: *** Android NDK: Aborting . Stop.
二、编译ffmpeg
1.将下载好的ffmpeg源码包,上传至服务器,解压进入ffmpeg目录:
2.修改ffmpeg的configure文件:
# 将 configure 文件中的:
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)'
为什么?
原因:Android 工程中只支持导入 .so 结尾的动态库,形如:libavcodec-57.so 。
但是FFmpeg 编译生成的动态库默认格式为 xx.so.版本号 ,形如:libavcodec.so.57 ,
所以需要修改 FFmpeg 根目录下的 configure 文件,使其生成以 .so 结尾格式的动态库。
3.编译 FFmpeg 之前,我们需要修改 FFmpeg 的编译选项,主要目的如下:
a.规定编译方式,使其通过交叉编译生成我们需要的动态库。
b.选择所需功能,针对需求定制 FFmpeg 功能,精简动态库。
在 FFmpeg 根目录下通过 ./configure 命令进行设置,但是为了方便记录与修改,我们选择在根目录下建立一个脚本文件来运行 ./configure 命令:
编写build_android.sh脚本,其中ndk路径为第一步骤中的安装路径,这个是编译的安卓系统X86_64版本的ffmpeg库:
#!/bin/bash
NDK=/usr/local/android/ndk/android-ndk-r14b
SYSROOT=$NDK/platforms/android-22/arch-x86_64/
TOOLCHAIN=$NDK/toolchains/x86_64-4.9/prebuilt/linux-x86_64
CPU=x86_64
PREFIX=$(pwd)/Android/$CPU
#--target-os=linux \ #目标系统
#--prefix=$PREFIX \ #规定编译文件在哪里生成
#--enable-cross-compile \ #启用交叉编译方式
#--cross-prefix=$TOOLCHAIN/bin/x86_64-linux-android- \ #交叉编译链
#--nm=$TOOLCHAIN/bin/x86_64-linux-android-nm
#--arch=x86_64 \ #目标平台架构
#--toolchain=hardened
#--sysroot=$SYSROOT \ #交叉编译环境
#--enable-gpl
#--enable-shared \ #生成动态库(共享库)
#--disable-static \ #禁止生成静态库
#--disable-indevs \ #禁用不需要的功能,下同
#--disable-asm
#--extra-cflags="-fPIC -DANDROID -D__thumb__ -Wfatal-errors -Wno-deprecated"
#-Wfatal-errors 首次出现错误的地方,在gcc中加入编译选项能够使编译停止在第一次出现错误的地方:
./configure --target-os=linux --prefix=$PREFIX --enable-cross-compile --cross-prefix=$TOOLCHAIN/bin/x86_64-linux-android- --nm=$TOOLCHAIN/bin/x86_64-linux-android-nm --arch=x86_64 --toolchain=hardened --sysroot=$SYSROOT --enable-gpl --enable-shared --disable-static --disable-indevs --disable-asm --extra-cflags="-fPIC -DANDROID -D__thumb__ -Wfatal-errors -Wno-deprecated"
4.在ffmpeg目录下手动创建Android/x86_64目录,回到ffmpeg主目录执行脚本./build_android.sh
此时需注意:要是在windows下编写此脚本,上传至服务器执行时可能会提示找不到文件;
这时需转换脚本的编码格式,
vi build_android.sh
:set ff=unix
保存退出
5.make
6.make install
7.进入Android/x86_64,看到的文件就是所需文件
3.2.12版本下载链接:
x86_64 :https://download.csdn.net/download/m0_37684310/10930150
arm : https://download.csdn.net/download/m0_37684310/10930034
ffmpeg源码及编译好所有库:https://download.csdn.net/download/m0_37684310/11080213
3.4.2版本下载链接:
ffmpeg源码及编译好所有库:https://download.csdn.net/download/m0_37684310/11080222
没有下载积分的可以联系邮箱lichongjiang@126.com,会尽快回复!