基于Android平台编译FFmpeg-3.2.4
说明
一个脚本实现 armeabi-v7a , x86 (按需添加)等多版本类型 ffmpeg 编译
环境配置
本人的环境配置如下
编译步骤
修改 ffmpeg 目录下 configure 文件
123SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'修改为如下
123SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'ps: 参考资料说需要修改 4 处 ,对比发现资料第二处修改前后是一样的.
添加如下脚本文件 build_android.sh 到 ffmpeg 文件夹目录下
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166#ndk 目录根据你的安装目录export ANDROID_NDK=$NDK_ROOT# 需要编译cup架构类型,加入下面的()中,用空格分割export SUPPORTED_ARCHITECTURES=(armeabi armeabi-v7a armeabi-v7a-neon x86 x86_64)#编译结果的目录export PREFIXDIR=android-lib# NDK 编译工具版本,参考 ANDROID_NDK/toolchains/ 目录下面文件夹末尾数字export NDK_TOOLCHAIN_ABI_VERSION=4.9# 需要支持的 Android 版本 , 参考 ANDROID_NDK/platforms/ 目录下面的文件夹名称export ANDROID_API_VERSION=23## 配置编译环境并且编译function configAndMake(){case ${ARCH} inarmeabi-v7a | armeabi-v7a-neon | armeabi)CPU='cortex-a8';;x86)CPU='i686';;x86_64)CPU="x86-64";;esacPREFIX="${PREFIXDIR}/${ARCH}"./configure \--prefix=$PREFIX \--enable-shared \--disable-static \--disable-doc \--disable-ffmpeg \--disable-ffplay \--disable-ffprobe \--disable-ffserver \--disable-doc \--disable-symver \--enable-small \--cross-prefix="$CROSS_PREFIX" \--cpu=$CPU \--target-os=linux \--arch=$ARCH \--enable-cross-compile \--sysroot=$SYSROOT \--extra-cflags="-I${TOOLCHAIN}/include $CFLAGS" \--extra-ldflags="-L${TOOLCHAIN}/lib $LDFLAGS"# --extra-libs="-lpng -lexpat -lm" \# --extra-cxxflags="$CXX_FLAGS" || exit 1make cleanmake -j8make install}### 设置 abi 类型对应的编译工具参数function initabi() {case $ARCH inarmeabi)NDK_ABI='arm'NDK_TOOLCHAIN_ABI='arm-linux-androideabi'NDK_CROSS_PREFIX="arm-linux-androideabi";;armeabi-v7a)NDK_ABI='arm'NDK_TOOLCHAIN_ABI='arm-linux-androideabi'NDK_CROSS_PREFIX="arm-linux-androideabi"CFLAGS="${CFLAGS} -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16"LDFLAGS="${LDFLAGS} -march=armv7-a -Wl,--fix-cortex-a8";;armeabi-v7a-neon)NDK_ABI='arm'NDK_TOOLCHAIN_ABI='arm-linux-androideabi'NDK_CROSS_PREFIX="arm-linux-androideabi"CFLAGS="${CFLAGS} -march=armv7-a -mfloat-abi=softfp -mfpu=neon"LDFLAGS="${LDFLAGS} -march=armv7-a -Wl,--fix-cortex-a8";;x86)NDK_ABI='x86'NDK_TOOLCHAIN_ABI='x86-linux-android'NDK_CROSS_PREFIX="i686-linux-android"CFLAGS="$CFLAGS -march=i686";;x86_64)NDK_ABI='x86_64'NDK_TOOLCHAIN_ABI='x86_64-linux-android'NDK_CROSS_PREFIX="x86_64-linux-android"CFLAGS="$CFLAGS -march=x86-64 -m64";;esacCROSS_PREFIX=${TOOLCHAIN}/bin/${NDK_CROSS_PREFIX}-NDK_SYSROOT=${TOOLCHAIN}/sysrootexport PKG_CONFIG_LIBDIR="${TOOLCHAIN}/lib/pkgconfig"$ANDROID_NDK/build/tools/make-standalone-toolchain.sh \--arch=$NDK_ABI \--platform=android-${ANDROID_API_VERSION} \--install-dir=$TOOLCHAIN \--forceexport CC="${CROSS_PREFIX}gcc"export LD="${CROSS_PREFIX}ld"export RANLIB="${CROSS_PREFIX}ranlib"export STRIP="${CROSS_PREFIX}strip"export READELF="${CROSS_PREFIX}readelf"export OBJDUMP="${CROSS_PREFIX}objdump"export ADDR2LINE="${CROSS_PREFIX}addr2line"export AR="${CROSS_PREFIX}ar"export AS="${CROSS_PREFIX}as"export CXX="${CROSS_PREFIX}g++"export OBJCOPY="${CROSS_PREFIX}objcopy"export ELFEDIT="${CROSS_PREFIX}elfedit"export CPP="${CROSS_PREFIX}cpp"export DWP="${CROSS_PREFIX}dwp"export GCONV="${CROSS_PREFIX}gconv"export GDP="${CROSS_PREFIX}gdb"export GPROF="${CROSS_PREFIX}gprof"export NM="${CROSS_PREFIX}nm"export SIZE="${CROSS_PREFIX}size"export STRINGS="${CROSS_PREFIX}strings"}## 初始化环境参数function initParam(){CFLAGS='-O3 -fpic -pipe -w'LDFLAGS=' 'FFMPEG_PKG_CONFIG="$(pwd)/ffmpeg-pkg-config"TOOLCHAIN=$HOME/fftoolchain #toolchain 安装目录SYSROOT=$TOOLCHAIN/sysroot/}## 编译某一种 cpu 对应的 libfunction build_one(){initParaminitabiconfigAndMakecleaner}## 编译所以类型 cpu 对应的 libfunction buildAll(){for i in "${SUPPORTED_ARCHITECTURES[@]}"doecho "now ,start to build $i"ARCH=$ibuild_onedone}## 删除编译工具function cleaner(){rm -rf $TOOLCHAINrm -rf ./compat/strtod.o}buildAll执行 build_android.sh
12sudo chmod 777 build_android.sh./build_android.sh编译完成后,ffmpeg 目录会出现 android-lib 文件夹,里面就是编译结果.