<
Ndk 交叉编译 运行在 android 的 ffmpeg
>
上一篇

Android 使用 编译后的 ffmpeg
下一篇

在 windows 中(非wsl) 编译 ffmpeg

ndk 交叉编译 运行在 Android 的 ffmpeg

ffmpeg 版本 n4.4.5

ndk 版本 21.4.7075529 26.1.10909125 26.3.11579264 27.2.12479018 试过都没问题

准备

由于 gcc 从 ndk 中移除,需要在 configure 时使用 –cc –cxx –ld 来分别指定 c/c++编译器和链接器。 找 ndk 的 clang 文件的位置,可以看见谷歌已经为我们写好各个架构和不同android版本的运行脚本。

下载 ffmpeg 源码

git clone https://github.com/FFmpeg/FFmpeg.git 并切换到需要编译的对应版本 tag 的 commit 上

安装软件

下载 Visual Studio 并安装 (记得勾选MSVC)

下载 msys2 并安装,打开

这两个软件是为了在 Windows 使用 Linux 环境去编译,即 Windows 原生 + msys2(使用 Windows 的 ndk)

此外还可以通过 WSL 也可以直接使用 Linux 环境(使用 Linux 的 ndk)

配置 msys2 环境

执行命令,可合并成一条命令

pacman -Syu
pacman -S base-devel
pacman -S yasm nasm gcc
pacman -S mingw-w64-x86_64-toolchain
pacman -S git
pacman -S make
pacman -S automake
pacman -S autoconf
pacman -S perl
pacman -S pkg-config

避免 msys2的link命令 与 linux的link命令冲突

C:\msys64\usr\bin\link.exe 文件,重命名为 link.exe.back

配置和编译 脚本

build_ffmpeg_by_ndk.sh

#!/bin/bash

set -e

# --arch=? 参数
# arm aarch64 i686 x86_64
ARCH=aarch64
# --cpu=? 参数
# armv7-a armv8-a
CPU=armv8-a
# jniLibs 目录下文件夹的名称
# armeabi-v7a arm64-v8a x86 x86_64
PLATFORM=arm64-v8a
# ndk 最小支持的 api
MIN_API=21

SRC_DIR=/z/Workspaces/FFmpeg
OUTPUT_DIR=/z/Workspaces/FFmpegAndroid/${PLATFORM}

cd ${SRC_DIR}

# NDK 路径,测试了新版需要加参数 `--disable-stripping`
# NDK=/z/AwesomeProgram/Android/sdk/ndk/21.4.7075529
NDK=/z/AwesomeProgram/Android/sdk/ndk/26.1.10909125

# 编译工具前缀
# TOOLS_BIN=/z/AwesomeProgram/Android/sdk/ndk/26.1.10909125/toolchains/llvm/prebuilt/windows-x86_64/bin
TOOLS_BIN=${NDK}/toolchains/llvm/prebuilt/windows-x86_64/bin

# C编译器,`aarch64-linux-android21-clang` 中的 `aarch64` 是对应Android设备的架构, `21` 是最低支持Android版本的API
# NDK_CC=/z/AwesomeProgram/Android/sdk/ndk/26.1.10909125/toolchains/llvm/prebuilt/windows-x86_64/bin/aarch64-linux-android21-clang
NDK_CC=${TOOLS_BIN}/aarch64-linux-android${MIN_API}-clang

# C++编译器
NDK_CXX=${TOOLS_BIN}/aarch64-linux-android${MIN_API}-clang++

# 链接器
NDK_LD=${TOOLS_BIN}/aarch64-linux-android${MIN_API}-clang

# 交叉编译工具前缀,取对应编译器路径 加 文件名前缀 加 `-`,具体查看NDK里的文件结构
CROSS_PREFIX=${TOOLS_BIN}/aarch64-linux-android-

echo ">> configure ..."

./configure \
  --cc=${NDK_CC} --cxx=${NDK_CXX} --ld=${NDK_LD} \
  --target-os=android --arch=${ARCH} --cpu=${CPU} \
  --enable-cross-compile --cross-prefix=${CROSS_PREFIX} \
  --prefix=${OUTPUT_DIR} \
  --enable-jni \
  --disable-static --enable-shared \
  --enable-small \
  --disable-asm \
  --disable-doc \
  --disable-debug \
  --disable-stripping \
  --enable-ffmpeg \
  --enable-ffprobe \
  --disable-ffplay \

echo "<< configure OK"

echo "<< build ..."

make clean

# 根据CPU实际设置线程数,我的 5600G 6核12线程
make -j12 & make install

echo "<< build OK"

ffmpeg 的 configure 配置的参数 部分说明

configure --help 查看全部

更多 FFmpeg中configure的参数配置解释 https://blog.csdn.net/Mr_Tony/article/details/131052939

脚本执行

  1. 先创建脚本,并执行

msvc_msys2.bat

@echo off
:: 1. 初始化 Visual Studio 环境
call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat"
:: 2. 启动 MSYS2 Shell (MinGW 64-bit 环境)
C:\msys64\msys2_shell.cmd -mingw64
  1. 在打开的 msys2 窗口执行前面的 build_ffmpeg_by_ndk.sh
bash /z/WorkspacesMine/script/build_ffmpeg_by_ndk.sh

注意使用对应路径

  1. 等待编译完成,输出的 so 文件在脚本的 OUTPUT_DIR 目录的 lib 下

  2. 需要定制功能就编辑前面的 configure 命令去定制

Top
Foot