FFmpeg打包成.so文件
- 简介
- 前置条件
- 打包步骤
-
- 步骤一:创建脚本文件
- [步骤 2:执行脚本编译 + 打包](#步骤 2:执行脚本编译 + 打包)
- 验证
简介
FFmpeg 编译并打包成 Android 可直接使用的 .so 动态库,这是Android音视频开发的核心步骤。我们现在通过在macos环境下编译一个.so文件,以下是完整的流程。
前置条件
- NDK 准备:例如版本 28.0.12433566
- FFmpeg 源码 (可根据此文章进行配置)
打包步骤
步骤一:创建脚本文件
在 ~/ffmpeg目录下创建 build_android.sh,这是生成 .so 的核心脚本
python
#!/bin/bash
export ANDROID_NDK_ROOT=~/Library/Android/sdk/ndk/28.0.12433566 # 设置 Android NDK 路径
export TOOLCHAIN=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/darwin-x86_64
export API=21 # 最低兼容安卓版本
export TARGET=aarch64-linux-android
# 设置编译工具
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
export AR=$TOOLCHAIN/bin/llvm-ar
export STRIP=$TOOLCHAIN/bin/llvm-strip
export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
# 清理之前的配置和编译结果
echo "清理之前的编译结果..."
make distclean 2>/dev/null || true
rm -f config.h config.mak ffbuild/config.mak
rm -rf ./android/arm64-v8a
echo "开始配置 FFmpeg..."
# 配置 FFmpeg
./configure \
--prefix=./android/arm64-v8a \
--target-os=android \
--arch=aarch64 \
--cpu=armv8-a \
--cc=$CC \
--cxx=$CXX \
--ar=$AR \
--strip=$STRIP \
--ranlib=$RANLIB \
--enable-cross-compile \
--enable-shared \
--disable-static \
--disable-programs \
--disable-doc \
--disable-symver \
--enable-small \
--disable-asm
if [ $? -eq 0 ]; then
echo "配置成功,开始编译..."
make -j8
if [ $? -eq 0 ]; then
echo "编译成功,开始安装..."x
make install
echo "编译完成!共享库文件位于 ./android/arm64-v8a/lib/ 目录"
ls -la ./android/arm64-v8a/lib/
echo ""
echo "文件大小统计:"
du -sh ./android/arm64-v8a/lib/*.so
else
echo "编译失败"
exit 1
fi
else
echo "配置失败"
exit 1
fi
步骤 2:执行脚本编译 + 打包
bash
# 1. 给脚本添加执行权限
chmod +x build_android.sh
# 2. 执行脚本(M芯片若报错,先执行 arch -x86_64 zsh 再运行)
./build_android.sh
验证
打包完成后,会出现一个"android"的文件夹。我们可以进入arm64-v8中(可以在脚本文件自定义文件名),以下是 Android 可直接使用的结构:
xml
android/arm64-v8a/ # 根目录
├── lib/ # 共享库目录
│ ├── libavcodec.so # 编解码库
│ ├── libavformat.so # 格式处理库
│ ├── libavfilter.so # 滤镜库
│ ├── libavutil.so # 工具库
│ ├── libswscale.so # 图像处理库
│ ├── libswresample.so # 音频重采样库
│ ├── libavdevice.so # 设备库
│ └── pkgconfig/ # 配置文件
│ ├── libavcodec.pc # 编解码库配置
│ ├── libavformat.pc # 格式库配置
│ ├── libavfilter.pc # 滤镜库配置
│ ├── libavutil.pc # 工具库配置
│ ├── libswscale.pc # 图像库配置
│ ├── libswresample.pc # 重采样库配置
│ └── libavdevice.pc # 设备库配置
├── include/ # 头文件目录
└── share/ # 共享数据文件
└── ffmpeg/ # FFmpeg数据文件
└── ... (预设文件和示例)