記錄一下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文件夾內。