2021年使用Android NDK编译FFMPEG实现webm转mp3问题求助
Android NDK r23+ 编译FFmpeg适配四架构解决方案
现有脚本问题
- 变量缺失:配置项引用了
$ARCH和$CPU,但脚本中未定义这两个变量,也没有做四架构的循环适配逻辑 - 参数拼写错误:
extra-cflags中的-0s是无效参数,正确写法为-Os(大写字母O,代表针对体积做优化),错误参数会导致编译阶段直接报错 - 依赖缺失:开启了
--enable-libshine参数,若未提前将shine库交叉编译为对应Android架构的版本,配置阶段会直接报错找不到依赖库 - 冗余配置:重复写了两次
--disable-everything,可删除其中一份
修正后的编译脚本
该脚本可自动完成aarch64、armv7、i686、x86_64四个架构的编译,使用前请修改开头的API、OUTPUT、NDK、SHINE_BUILD_ROOT四个参数为你本地的对应路径:
#!/bin/bash # 自定义配置项 API=31 # 目标Android API版本 OUTPUT=/home/romain/dev/android/ffmpeg_build # 编译输出根路径 NDK=/home/romain/android-sdk/ndk/23.0.7599858 # NDK本地路径 SHINE_BUILD_ROOT=/home/romain/dev/android/shine_build # 提前交叉编译好的libshine输出根路径,子目录对应四个架构 # 固定配置项 TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64 SYSROOT=$TOOLCHAIN/sysroot ARCH_CONFIGS=( "armv7a armv7-a arm-linux-androideabi" "aarch64 armv8-a aarch64-linux-android" "x86 i686 i686-linux-android" "x86_64 x86-64 x86_64-linux-android" ) for config in "${ARCH_CONFIGS[@]}"; do read ARCH CPU TOOL_PREFIX <<< "$config" ARCH_OUTPUT=$OUTPUT/$ARCH mkdir -p $ARCH_OUTPUT # 定义编译工具链 CC="$TOOLCHAIN/bin/${TOOL_PREFIX}${API}-clang" CXX="$TOOLCHAIN/bin/${TOOL_PREFIX}${API}-clang++" AR="$TOOLCHAIN/bin/llvm-ar" RANLIB="$TOOLCHAIN/bin/llvm-ranlib" STRIP="$TOOLCHAIN/bin/llvm-strip" # 清理上一次编译缓存 make clean ./configure \ --prefix=$ARCH_OUTPUT \ --target-os=android \ --arch=$ARCH \ --cpu=$CPU \ --disable-everything \ --disable-network \ --disable-autodetect \ --enable-small \ --enable-decoder=opus,vorbis \ --enable-demuxer=matroska \ --enable-muxer=mp3 \ --enable-protocol=file \ --enable-filter=aresample \ --enable-libshine \ --enable-encoder=libshine \ --cc=$CC \ --cxx=$CXX \ --ar=$AR \ --ranlib=$RANLIB \ --strip=$STRIP \ --sysroot=$SYSROOT \ --extra-cflags="-Os -fpic -I$SHINE_BUILD_ROOT/$ARCH/include" \ --extra-ldflags="-L$SHINE_BUILD_ROOT/$ARCH/lib" make -j$(nproc) make install done
注意事项
- 若不需要libshine,可删除配置中的
--enable-libshine、--enable-encoder=libshine以及和shine路径相关的参数,替换为内置mp3编码器即可,不过内置编码器编译后体积会略大 - 编译完成后可使用llvm-strip二次处理生成的二进制文件,可额外缩小10%~20%的体积,完全可以做到2MB以内的大小要求
- 若不需要生成ffmpeg可执行文件仅需要调用库,可添加
--disable-programs参数进一步压缩体积
内容的提问来源于stack exchange,提问作者Kyros
相关产品推荐
相关产品推荐

