FFmpeg 5.x 编译 so 文件的记录

记录一下 FFmpeg 给 Android 编译 so 文件的全过程

FFmpeg 版本:5.1.7

NDK 版本:21.4.7075529

源码准备

复制代码
git clone https://github.com/FFmpeg/FFmpeg

切换到 5.1.7 版本

复制代码
cd ./FFmpeg
git checkout -b n5.1.7

so 文件编译脚本 (build_android.sh) (就放在 FFmpeg 目录中即可)

这里唯一需要你指定 NDK 的目录. 替换成 ndk 所在的目录

复制代码
#!/bin/bash

# 配置NDK路径
NDK=<NdkParentPath>/ndk/21.4.7075529
# 配置编译目标Android版本
API=21
# 配置输出目录
OUTPUT=$(pwd)/android_build

# 支持的架构
ARCHS=("arm64-v8a" "armeabi-v7a" "x86" "x86_64")
# ARCHS=("arm64-v8a" "x86")

# 循环编译各架构
for ARCH in "${ARCHS[@]}"; do
    echo "开始编译 $ARCH..."
    
    # 根据架构设置编译参数
    case $ARCH in
        arm64-v8a)
            CPU=armv8-a
            CROSS_PREFIX=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-
            CC=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android$API-clang
            CXX=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android$API-clang++
            ARCH_CONFIG="aarch64"
            ;;
        armeabi-v7a)
            CPU=armv7-a
            CROSS_PREFIX=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-
            CC=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/armv7a-linux-androideabi$API-clang
            CXX=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/armv7a-linux-androideabi$API-clang++
            ARCH_CONFIG="arm"
            ;;
        x86)
            CPU=i686
            CROSS_PREFIX=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android-
            CC=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android$API-clang
            CXX=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android$API-clang++
            ARCH_CONFIG="x86"
            ;;
        x86_64)
            CPU=x86-64
            CROSS_PREFIX=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android-
            CC=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android$API-clang
            CXX=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android$API-clang++
            ARCH_CONFIG="x86_64"
            ;;
    esac

    # 创建输出目录
    mkdir -p $OUTPUT/$ARCH

    # 配置FFmpeg编译参数
    ./configure \
        --prefix=$OUTPUT/$ARCH \
        --enable-cross-compile \
        --target-os=android \
        --arch=$ARCH_CONFIG \
        --cpu=$CPU \
        --cc=$CC \
        --cxx=$CXX \
        --cross-prefix=$CROSS_PREFIX \
        --sysroot=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/sysroot \
        --extra-cflags="-Os -fpic -DANDROID -D__ANDROID_API__=$API" \
        --extra-ldflags="-lm" \
        --enable-shared \
        --disable-static \
        --disable-doc \
        --disable-programs \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-symver \
        --enable-small \
        --disable-asm

    # 编译并安装
    make clean
    make -j$(nproc)
    make install

    echo "$ARCH 编译完成"
done

echo "所有架构编译完成,输出目录: $OUTPUT"

正式开始编译 so 文件

复制代码
chmod u+x ./build_android.sh
./build_android.sh
相关推荐
海带紫菜菠萝汤1 天前
FFmpeg.wasm 实践:在浏览器中运行 FFmpeg 的能力边界与性能瓶颈
前端·javascript·ffmpeg·音视频·wasm
程序员老陆2 天前
FFmpeg6的滤镜函数解析
ffmpeg·音视频·avfilter
看浪的路人2 天前
第10讲:Python 调用 FFmpeg 批量处理——打造你的视频处理工具箱
python·ffmpeg·音视频
程序员老陆3 天前
FFmpeg 时间戳全解:从 av_rescale_q 到时间基黑洞
ffmpeg·音视频·时间基
水獭比特3 天前
自动成片没报错,为什么音画还会漂?
ffmpeg
Yeauty3 天前
2026 年在 Rust 里处理音视频,该走哪条路?
rust·ffmpeg·音视频·视频
勿忘初心12214 天前
【Windows流媒体实战1】FFmpeg+Nginx-RTMP Windows详细搭建教程
ffmpeg·nginx-rtmp·windows流媒体搭建·rtmp直播
勿忘初心12214 天前
【Windows流媒体实战2】SpringBoot2.x 整合FFmpeg 完整实操教程
ffmpeg·springboot·流媒体开发·nginx-rtmp·rtmp视频录制
Yeauty7 天前
你那条 ffmpeg 命令,一键翻成 Rust builder 代码
开发语言·rust·ffmpeg
Yeauty8 天前
用 Whisper 转录前,你不用再离开 Rust
开发语言·rust·ffmpeg·音视频·视频