记录一下Linux FFmpeg Android版本的编译过程,以免日后再次编译遗忘。
系统ubuntu18.04、FFmpeg4.2.2、ndk r21。
首先我要编译的是Android版本的库,故需要对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)'
然后创建编译脚本build_android.sh
#!/bin/bash
#自己的ndk路径,采用的是clang++所有ndk最好用r17以上
NDK=/home/hjt/ndk/android-ndk-r21
TOOLCHAIN=$NDK/toolchainsvm/prebuiltnux-x86_64/
#目标api建议最好设小一点,本人遇到过此处api设置为29结果编译出来的库在低版本手机上运行时出现找不到库的情况
API=21
function build_android
{
echo "Compiling FFmpeg for $CPU"
#FFmpeg编译选项 enable为打开,disable为关闭
./configure \
--prefix=$PREFIX \
--enable-neon \
--enable-hwaccels \
--enable-gpl \
#开启输出so库
--enable-shared \
#以下4行是Android硬编解码的选项,但是在手机上跑还是未能成功开启硬解码器,暂时未查明原因。
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-hwaccel=h264_mediacodec\
#后期处理的库可以选择要或者不要
--disable-postproc \
#关闭输出静态库
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC
--cxx=$CXX
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
#可以选择 make -j4或者更多以加快编译速度
make
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}
#armv8-a
ARCH=arm64
CPU=armv8-a
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchainsvm/prebuiltnux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
build_android
#armv7-a
ARCH=arm
CPU=armv7-a
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchainsvm/prebuiltnux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
build_android
脚本创建完成后执行 chmod +x build_android.sh
然后执行脚本 ./build_android.sh
最后输出的库在Android文件夹内。