macos环境下FFmpeg打包成.so文件

FFmpeg打包成.so文件

简介

FFmpeg 编译并打包成 Android 可直接使用的 .so 动态库,这是Android音视频开发的核心步骤。我们现在通过在macos环境下编译一个.so文件,以下是完整的流程。

前置条件

  1. NDK 准备:例如版本 28.0.12433566
  2. 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数据文件
        └── ... (预设文件和示例)
相关推荐
程序员老陆2 小时前
WHIP 与 WHEP:WebRTC 直播的标准化入口与出口
ffmpeg·音视频·webrtc·whip·whep
linux_cfan4 小时前
16 · `custom-media-element`:属性拦截与转发
前端·javascript·音视频
Liekkas Kono6 小时前
macOS 27 安装 VMware Fusion 和 Win11 经验
macos·win11·vmware
纽格立科技7 小时前
动力的转向:当智能不再依赖碳基
车载系统·音视频·信息与通信·传媒
烟雨江南7857 小时前
会议语音识别私有化部署方案:音频不出内网,如何接入现有会议系统
人工智能·websocket·音视频·语音识别·ai客服
镭封21 小时前
短剧多人对白怎么配?一人完成多角色配音的办法
人工智能·音视频·语音识别·媒体
技灵AI1 天前
Wan 3.0 API怎么做多参考商品视频?从图片、视频、音频分工到30秒交付
人工智能·prompt·aigc·音视频·wan 3.0
赛博仓鼠1 天前
MiniMax H3 实测:8GB显存跑2K视频+原生音频,开源视频生成的新卷王
开源·aigc·音视频
byte轻骑兵1 天前
【LE Audio】PBP精讲[4]: 公共广播通告的设计逻辑与数据交互流程
人工智能·音视频·le audio·低功耗蓝牙音频
hz567891 天前
手术室视频示教系统解决方案:让临床教学突破空间限制
安全·音视频·实时音视频·信息与通信·智能硬件