ffmpeg(10)-Windows环境下编译so库供android使用

148 阅读1分钟

直接在MYSY2里面安装所有环境,如果你使用了deepseek,可以直接进行相关搜索,如:“Windows环境下,使用MYSY2编译FFmpeg7.1.1、andorid-ndk-r24进行交叉编译,生成android可以使用的so库”。关键是.build_android.sh的配置,直接参考如下:

#!/bin/bash

# 配置项 ---------------------------------------------------------------------
NDK="E:/common_code/videoProject/ffmpeg_source/android-ndk-r28"
ANDROID_API=24
ARCH_LIST=("armeabi-v7a" "arm64-v8a")

declare -A TOOLCHAIN_MAP=(
    ["armeabi-v7a"]="armv7a-linux-androideabi"
    ["arm64-v8a"]="aarch64-linux-android"
)

# 编译函数 -------------------------------------------------------------------
function build_ffmpeg() {
    local ARCH=$1
    local OUTPUT_DIR="./android/${ARCH}"
    mkdir -p "${OUTPUT_DIR}"

    # 动态设置 API 版本
    local LOCAL_API=$ANDROID_API
    if [ "$ARCH" == "armeabi-v7a" ]; then
        LOCAL_API=21
    fi

    local TOOLCHAIN_PREFIX=${TOOLCHAIN_MAP[$ARCH]}
    local TOOLCHAIN_PATH="${NDK}/toolchains/llvm/prebuilt/windows-x86_64"
    local BIN_DIR="${TOOLCHAIN_PATH}/bin"
    local SYSROOT="${TOOLCHAIN_PATH}/sysroot"
    local CC="${BIN_DIR}/${TOOLCHAIN_PREFIX}${LOCAL_API}-clang"
    local CXX="${BIN_DIR}/${TOOLCHAIN_PREFIX}${LOCAL_API}-clang++"

    # 深度清理
    make distclean > /dev/null 2>&1
    rm -rf ./compat/*.o ./**/*.d ./**/*.o

    ./configure \
        --prefix="${OUTPUT_DIR}" \
        --target-os=android \
        --arch="${ARCH%%-*}" \
        --enable-cross-compile \
        --cross-prefix="${BIN_DIR}/llvm-" \
        --sysroot="${SYSROOT}" \
        --cc="${CC}" \
        --cxx="${CXX}" \
        --ar="${BIN_DIR}/llvm-ar" \
        --nm="${BIN_DIR}/llvm-nm" \
        --strip="${BIN_DIR}/llvm-strip" \
        --disable-autodetect \
        --pkg-config="pkg-config" \
        --extra-cflags="-Os -fPIC -DANDROID" \
        --extra-ldflags="-fPIC" \
        $( [ "$ARCH" == "armeabi-v7a" ] && echo "--enable-neon" ) \
        --enable-jni \
        --enable-gpl

    make -j8 && make install

    if [ $? -ne 0 ]; then
        echo "[ERROR] ${ARCH} 编译失败!"
        exit 1
    fi
}

# 主流程 ---------------------------------------------------------------------
for ARCH in "${ARCH_LIST[@]}"; do
    echo "开始编译架构: ${ARCH}"
    build_ffmpeg "${ARCH}"
done

echo "所有架构编译完成!输出目录: ./android/"

生成的so库如下:

image.png