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数据文件
        └── ... (预设文件和示例)
相关推荐
珂玥c8 小时前
vware的mac虚拟机转换为.qcow格式
macos
#山间清泉#8 小时前
VMWare虚拟机mac地址自定义配置
运维·macos·架构·vmware
byte轻骑兵9 小时前
【LE Audio】CAP精讲[3]: 角色能力清单拆解,CAP支持要求全流程解析
人工智能·音视频·le audio·低功耗音频·蓝牙通话
EasyDSS20 小时前
私有化音视频系统/视频直播点播/音视频点播EasyDSS构建智慧校园视频智能服务新体系
音视频
我是发哥哈21 小时前
跨AI模型生成视频的五大维度对比:选型避坑指南
大数据·人工智能·学习·机器学习·chatgpt·音视频
道剑剑非道1 天前
FFmpeg 6.0 实战:用 C++ 封装摄像头采集与 RTSP 推流
开发语言·c++·ffmpeg
墨染倾城殇1 天前
蓝牙 5.3 双模一体,面向车载、智能音箱及多场景的经典音频与LE Audio应用
音视频·智能音箱·le audio·蓝牙双模·蓝牙5.3
Gc9umsbL11 天前
从FLAC到WAV:whisper.cpp中的FFmpeg音频预处理全解析
ffmpeg·whisper·音视频
angushine1 天前
ffmpeg+nginx搭建HLS 推流
运维·nginx·ffmpeg
UnicornDev1 天前
从零开始学iOS开发(第四十四篇):App Store 提交与审核 —— 让应用走向世界
macos·objective-c·cocoa