最近研究音视频,ffmpeg是一个非常著名的开源项目,分享一下自己从0到编译ffmpeg的过程,希望能帮助其他人趟坑。
很多的帖子都推荐编译3.3.6的版本,因为提到高版本都有编译不过的坑,所以我也是编译3.3.6,NDK是android-ndk-r15c,其实编译部分的坑不多,不过,有些帖子的编译脚本编译出来时会少文件的,引入到android项目里面就各种报错。
以下编译流程在linux系统执行,与macos下差异不大 我编译使用的NDK source.propertis
Pkg.Desc = Android NDK
Pkg.Revision = 15.2.4203891
ffmpeg版本
3.36
platform version
android-21
ndk下载路径:
ffmpeg: 3.3.6
很多帖子推荐使用andoird-15,不过我看了我所有的platform version,andorid-21开始才支持arm64架构的编译
创建一个build_andrid.sh
这个文件要在解压后的ffmpeg根目录
#!/bin/bash
cd `dirname $0`
#临时缓存路径,如果使用一定要确保文件夹存在
export TMPDIR=/home/nightmare/文档/Android_Project/tempdir
#ndk的根目录
NDK=/home/nightmare/Android/Ndk/android-ndk-r15c
#以下就是一个编译执行的函数
configure()
{
#$1代表这个函数收到的第一个参数
CPU=$1
#输出目录
PREFIX=$(pwd)/android/$CPU
#编译平台版本
ARCH=""
#交叉编译可执行文件的头部分,在bin文件夹,有一系列arm-linux-androideabi-开头的可执行程序
#如arm-linux-androideabi-gcc,但编译时只需要它的头部部分
CROSS_PREFIX=""
#所选使用的编译版本路径
SYSROOT=""
if [ "$CPU" == "armv7-a" ]
then
ARCH="arm"
SYSROOT=$NDK/platforms/android-21/arch-arm/
CROSS_PREFIX=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
else
ARCH="aarch64"
SYSROOT=$NDK/platforms/android-21/arch-arm64/
CROSS_PREFIX=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-
fi
echo "start build ffmpeg for $ARCH"
# #调用configure命令开始编译,并传入对应的参数
./configure --target-os=linux \
--prefix=$PREFIX --arch=$ARCH \
--disable-doc \
--disable-static \
--disable-yasm \
--disable-asm \
--disable-symver \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--cross-prefix=$CROSS_PREFIX \
--enable-cross-compile \
--enable-shared \
--enable-gpl \
--sysroot=$SYSROOT \
--enable-small \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
}
build()
{
make clean
cpu=$1
echo "build $cpu"
configure $cpu
#-j<CPU核心数>
make -j8
make install
echo "build ffmpeg for $ARCH finished"
}
build arm64
# build armv7-a
这是我的环境使用的编译脚本,请务必将其中的环境变量改为自己环境对应的路径,已经补充上了很多注释,并且执行脚本的时候不需要手动切换pwd路径为ffmpeg根目录
最后两行极为一键编译的命令,只需要更改build 后面的参数即可 注意如果需要直接执行
chmod 777 build_android.sh
./build_android.sh
或者
sh build_android.sh
附上我在manjaro的编译截图