一、简介
我的环境:
mac+ndkr13b+ffmpeg3.4.7
二、编译FFmpeg
1.修改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)'
完成后保存即可。
2.脚本
配置的基础脚本如下。
build.sh 编译架构名称:#!/bin/bash
# 获取指定架构名称
if [ "$#" -lt 1 ]; then
THE_ARCH=armv7
else
THE_ARCH=$(tr [A-Z] [a-z] <<< "$1")
fi
# 查找指定架构参数信息
case "$THE_ARCH" in
arm|armv5|armv6|armv7|armeabi)
# 配置参数
# toolchain下的文件夹名称前缀
TOOLCHAIN_LEFT=arm-linux-androideabi
# android版本下的编译器
ANDROID_PLATFORMS=arm
# CMAKE_SYSTEM_PROCESSOR下的配置名称
PROCESSOR_PLATFORMS=arm
# prebuilt文件夹下的编译器名称
TOOLCHAIN_PLEBUILT=arm-linux-androideabi
# include下全名
INCLUDE_PLATFORMS=arm-linux-androideabi
# CFLAGS是否有配置项
CFLAGS_MARCH="-march=armv5te"
# 文件夹名称
BUILD_NAME=armeabi
;;
armv7a|armeabi-v7a)
# 配置参数
# toolchain下的文件夹名称前缀
TOOLCHAIN_LEFT=arm-linux-androideabi
# android版本下的编译器
ANDROID_PLATFORMS=arm
# CMAKE_SYSTEM_PROCESSOR下的配置名称
PROCESSOR_PLATFORMS=arm
# prebuilt文件夹下的编译器名称
TOOLCHAIN_PLEBUILT=arm-linux-androideabi
# include下全名
INCLUDE_PLATFORMS=arm-linux-androideabi
# CFLAGS是否有配置项
CFLAGS_MARCH="-march=armv7-a -mfloat-abi=softfp -mfpu=neon"
BUILD_NAME=armeabi-v7a
;;
armv8|armv8a|aarch64|arm64|arm64-v8a)
# 配置参数
# toolchain下的文件夹名称前缀
TOOLCHAIN_LEFT=aarch64-linux-android
# android版本下的编译器
ANDROID_PLATFORMS=arm64
# CMAKE_SYSTEM_PROCESSOR下的配置名称
PROCESSOR_PLATFORMS=aarch64
# prebuilt文件夹下的编译器名称
TOOLCHAIN_PLEBUILT=aarch64-linux-android
# include下全名
INCLUDE_PLATFORMS=aarch64-linux-android
# CFLAGS是否有配置项
CFLAGS_MARCH="-march=armv8-a"
BUILD_NAME=arm64-v8a
;;
x86)
# 配置参数
# toolchain下的文件夹名称前缀
TOOLCHAIN_LEFT=x86
# android版本下的编译器
ANDROID_PLATFORMS=x86
# CMAKE_SYSTEM_PROCESSOR下的配置名称
PROCESSOR_PLATFORMS=x86
# prebuilt文件夹下的编译器名称
TOOLCHAIN_PLEBUILT=i686-linux-android
# include下全名
INCLUDE_PLATFORMS=i686-linux-android
# CFLAGS是否有配置项
CFLAGS_MARCH="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
BUILD_NAME=x86
;;
x86_64|x64)
# 配置参数
# toolchain下的文件夹名称前缀
TOOLCHAIN_LEFT=x86_64
# android版本下的编译器
ANDROID_PLATFORMS=x86_64
# CMAKE_SYSTEM_PROCESSOR下的配置名称
PROCESSOR_PLATFORMS=x86_64
# prebuilt文件夹下的编译器名称
TOOLCHAIN_PLEBUILT=x86_64-linux-android
# include下全名
INCLUDE_PLATFORMS=x86_64-linux-android
# CFLAGS是否有配置项
CFLAGS_MARCH="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel"
BUILD_NAME=x86_64
;;
esac
# 基本配置
#ndk所在目录
NDK_PATH=...Android/sdk/ndk/android-ndk-r13b
#编译环境这里是 macOS
BUILD_PLATFORM=darwin-x86_64
#编译工具链版本
TOOLCHAIN_VERSION=4.9
#最低兼容
ANDROID_VERSION=21
SYSROOT=${NDK_PATH}/platforms/android-${ANDROID_VERSION}/arch-${ANDROID_PLATFORMS}
TOOLCHAIN=${NDK_PATH}/toolchains/${TOOLCHAIN_LEFT}-${TOOLCHAIN_VERSION}/prebuilt/${BUILD_PLATFORM}/bin/${TOOLCHAIN_PLEBUILT}-
# 编译后文件路径
PREFIX=.../ffmpeg-android/obj/${BUILD_NAME}
mkdir -p ${PREFIX}
./configure \
--prefix=$PREFIX \
--target-os=android \
--arch=$PROCESSOR_PLATFORMS \
--sysroot=$SYSROOT \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN \
--extra-cflags="$CFLAGS_MARCH -Os -fPIC -DANDROID -Wfatal-errors -Wno-deprecated" \
--extra-cxxflags="-D__thumb__ -fexceptions -frtti" \
--extra-ldflags="-L${SYSROOT}/usr/lib" \
--enable-shared \
--enable-runtime-cpudetect \
--enable-gpl \
--enable-small \
--enable-cross-compile \
--disable-debug \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-postproc \
--disable-avdevice \
--disable-symver \
--disable-stripping
make clean
make
make install
注意: 这里需要着重注意,由于调用 make install,在编译完成后会将这个ffmpeg安装到本地将原ffmpeg进行覆盖(准确将不是覆盖软件,而是path环境覆盖,原软件并没有被删除或是升级)。需要注意,在编译完成后可以通过在安装软件的路径下卸载即可 make uninstall。这里删除后,覆盖的ffmpeg就会暴露出来,无需再次安装。
3.配置全架构脚本
build_all.shfor arch in armeabi armeabi-v7a arm64-v8a x86 x86_64
do
bash build.sh $arch
done