前言
记录下自己在mac环境 对ffmpeg进行交叉编译生成动态库的步骤
环境工具
macOS 10.14.6
ndk版本: android-ndk-r20b
ffmpeg版本:ffmpeg-4.2.2
配置环境:
第一步下载ndk
推荐官网下载:https://developer.android.google.cn/ndk/downloads?hl=zh-cn
去官网选择自己需要下载的版本号,我选择的版本:android-ndk-r20b
下载成功之后解压并保存ndk的路径, 记录我的ndk路径 :/Users/mac/android-ndk-r20b/
第二步下载ffmpeg
ffmpeg这个库音视频必备 推荐下载官网最新版:http://ffmpeg.org/download.html
选择你需要的版本,推荐选择最新版本的ffmpeg进行编译,我选择的版本:ffmpeg-4.2.2
第三步编写shell脚本:
进入到ffmpeg的根目录下,该脚步直接放在当前目录
#通过命令创建shell文件
vim ./ffmpeg_build.sh
复制下方代码 到创建好的ffmpeg_build.sh文件中
该脚本交叉编译ffmpeg-4.2.2版本 使用 android-ndk-r20b版本 其他版本没有测试过!!!使用该脚本编译其他版本时一定先检查里面路径是否配置正确
#!/bin/bash
# 替换自己的NDK目录
NDK=/Users/mac/android-ndk-r20b
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
#sdk版本支持版本
API=21
echo "------------该脚本交叉编译ffmpeg-4.2.2版本 使用 android-ndk-r20b ------------"
function build_android
{
echo "Compiling FFmpeg for $CPU"
./configure \
--prefix=$PREFIX \
--disable-hwaccels \
--disable-gpl \
--disable-postproc \
--enable-shared \
--enable-jni \
--disable-mediacodec \
--enable-small \
--enable-gpl \
--disable-decoder=h264_mediacodec \
--disable-static \
--disable-doc \
--disable-programs \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-symver \
--enable-neon \
--disable-asm \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-mno-stackrealign -Os $OPTIMIZE_CFLAGS -fPIC" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make -j16
make install
echo "------------The Compilation of FFmpeg for $CPU is completed-----------"
}
# armv8-a
ARCH=arm64
CPU=armv8-a
# r21版本的ndk中所有的编译器都在/toolchains/llvm/prebuilt/darwin-x86_64/目录下(clang)
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
# ndk头文件环境
SYSROOT=$TOOLCHAIN/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
# so文件输出路径
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
build_android
# 交叉编译工具目录,对应关系如下
# armv8a -> arm64 -> aarch64-linux-android-
# armv7a -> arm -> arm-linux-androideabi-
# x86 -> x86 -> i686-linux-android-
# x86_64 -> x86_64 -> x86_64-linux-android-
# CPU架构
# armv7-a
ARCH=arm
CPU=armv7-a
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$TOOLCHAIN/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
build_android
# x86
ARCH=x86
CPU=x86
CC=$TOOLCHAIN/bin/i686-linux-android$API-clang
CXX=$TOOLCHAIN/bin/i686-linux-android$API-clang++
SYSROOT=$TOOLCHAIN/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
build_android
# x86_64
ARCH=x86_64
CPU=x86-64
CC=$TOOLCHAIN/bin/x86_64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/x86_64-linux-android$API-clang++
SYSROOT=$TOOLCHAIN/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"
# 方法调用
echo "---------------开始编译---------------"
build_android
echo "---------------结束编译---------------"
确认无误
执行
#命令窗口直接运行
./ffmpeg_build.sh
#如果第一次运行没有权限使用
chmod +x ./ffmpeg_build.sh #获取权限之后再次运行./ffmpeg_build.sh
如果配置正确 此时会开始交叉编译了
等待10分钟左右 编译好之后当前路径中生成/android目录
如果需要修改编译文件输出路径,查找并修改shell文件中的 PREFIX=$(pwd)/android/$CPU
$(pwd):当前目录
总结
FFmpeg的交叉编译对于不熟悉C/C++和Cmake的有一定的难度,一步步提升自己,此文章记录自己编译过程的使用步骤。
如果编译失败首先检查版本号和路径是否都正确,可以查看ffmpeg目录下的android-build文件下的日志文件 根据错误排查。