在 Windows 系统下,将 FFmpeg 编译为 .so 文件

发布于:2025-03-21 ⋅ 阅读:(20) ⋅ 点赞:(0)

1. 准备环境

确保你的 Windows 系统已安装以下工具:

  • Android Studio

  • NDK(Native Development Kit)

  • MSYS2(用于提供类 Unix 环境)

  • FFmpeg 源码

  • Git Bash(可选,推荐使用)

安装 MSYS2
  1. 下载并安装 MSYS2

  2. 打开 MSYS2 终端,更新包管理器:

pacman -Syu

      3.安装必要的工具:

pacman -S make pkg-config diffutils git

2. 下载 FFmpeg 源码

在 MSYS2 终端中,克隆 FFmpeg 源码:

git clone https://github.com/FFmpeg/FFmpeg.git
cd FFmpeg

3. 配置 FFmpeg 编译脚本

在 FFmpeg 源码目录中创建一个 build_android.sh 脚本,内容如下:

#!/bin/bash

# 设置 NDK 路径
NDK=/d/aaa/ndk/21.4.7075529
# 设置输出目录
OUTPUT=/d/output

# 定义架构和 API 组合
ARCHS=("arm" "arm64")
CPUS=("armv7-a" "armv8-a")
APIS=(21 21)

# 遍历架构
for i in "${!ARCHS[@]}"; do
    ARCH=${ARCHS[$i]}
    CPU=${CPUS[$i]}
    API=${APIS[$i]}

    # 设置工具链
    TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/windows-x86_64
    SYSROOT=$TOOLCHAIN/sysroot

    # 设置编译器和编译选项
    if [ "$ARCH" == "arm" ]; then
        CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
        CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
    else
        CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
        CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
    fi

    CFLAGS="-march=$CPU -Os -fPIC -D__ANDROID_API__=$API"
    LDFLAGS=""

    # 配置 FFmpeg
    ./configure \
        --prefix=$OUTPUT/$ARCH \
        --enable-shared \
        --disable-static \
        --disable-doc \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-symver \
        --disable-asm \
        --enable-cross-compile \
        --cross-prefix=$CROSS_PREFIX \
        --target-os=android \
        --arch=$ARCH \
        --sysroot=$SYSROOT \
        --cc=$CC \
        --extra-cflags="$CFLAGS" \
        --extra-ldflags="$LDFLAGS"

    # 编译并安装
    make clean
    make -j4
    make install
done

确保你的 NDK 已经解压或安装到 D:\aaa 目录下。例如,NDK 的完整路径可能是:

D:\aaa\ndk\25.1.8937393

在 FFmpeg 编译脚本中,将 NDK 路径设置为 D:\aaa 目录。由于 Windows 路径使用反斜杠 \,而在类 Unix 环境(如 MSYS2)中需要使用正斜杠 /,因此需要将路径转换为类 Unix 格式。

4. 运行编译脚本

  1. 在 MSYS2 终端中,进入 FFmpeg 源码目录。

  2. 运行编译脚本:

chmod +x build_android.sh
./build_android.sh

编译完成后,.so 文件会生成在 OUTPUT 指定的目录中。

5.检查编译器版本

运行以下命令检查 gcc 或 clang 的版本:

gcc --version

clang --version

6. 升级 GCC 或 Clang

pacman -Syu
pacman -S mingw-w64-x86_64-gcc

如果报错,检查

7. 检查是否安装了 GCC

运行以下命令检查 GCC 是否已安装:

which gcc

pacman -Q mingw-w64-x86_64-gcc

确认 GCC 的安装路径

GCC 的可执行文件通常安装在 MSYS2 的 mingw64/bin 目录下。运行以下命令,检查 GCC 是否存在:

ls /mingw64/bin/gcc.exe

8.配置环境变量(如果需要)

如果 gcc --version 仍然报错,可能是因为 GCC 的路径没有添加到系统的环境变量中。

  • 确保 MSYS2 的 mingw64/bin 或 usr/bin 目录在环境变量中。

  • 打开 MSYS2 终端,运行以下命令检查路径:

echo $PATH

如果路径中没有 mingw64/bin 或 usr/bin,手动添加:

export PATH=/mingw64/bin:$PATH

临时添加(仅当前终端会话有效)

运行以下命令:

export PATH=/mingw64/bin:$PATH

永久添加(对所有终端会话有效)

编辑你的 shell 配置文件(如 ~/.bashrc 或 ~/.bash_profile),添加以下行:

export PATH=/mingw64/bin:$PATH

然后运行以下命令使配置生效:

source ~/.bashrc