文章目录
准备工作
1. 准备 Linux 环境
搭建 Linux 环境,网上已有很多的教程。本文使用的是 WSL2(Windows Subsystem for Linux) 环境,感兴趣的读者可在最后一章参考资料中了解更多信息。
2. 下载 FFmpeg 源码
- 下载地址:https://ffmpeg.org/download.html#releases
- 下载 5.1.4 版本:
wget https://ffmpeg.org/releases/ffmpeg-5.1.4.tar.xz
- 解压缩:
tar -xvf ffmpeg-5.1.4.tar.xz
3. 下载 ndk 工具
- 下载地址:https://developer.android.com/ndk/downloads?hl=zh-cn
- 下载 ndk r26c 版本
- 解压缩:
unzip android-ndk-r26c-linux.zip
4. 配置系统环境变量
- 拷贝解压后的 android-ndk-r26c-linux 目录到 ~/ndk 路径下
- 命令行输入
vim ~/.bashrc
编辑 bashrc 文件 - 在 bashrc 文件末尾追加以下内容后保存并退出:
export NDK_PATH=~/ndk/android-ndk-r26c
export PATH=$NDK_PATH/toolchains/llvm/prebuilt/linux-x86_64/bin/:$PATH
- 命令行输入
source ~/.bashrc
编译 FFmpeg 源码
1. 编译选项简介
FFmpeg 源码使用 configure 脚本进行编译前配置,使用 ./configure --help
可以查看支持的编译配置选项。
标准选项: 这些选项用于配置基本的编译和安装参数。例如,–prefix=PREFIX 选项用于指定安装路径。
授权选项: 这些选项用于控制 FFmpeg 的许可证。例如,–enable-gpl 选项允许使用 GPL 许可的代码。
编译和连接选项: 这些选项用于控制 FFmpeg 的编译配置。例如,–disable-static 选项用于禁用静态库的构建,–enable-shared 选项用于启用动态库的构建。
可执行程序控制选项: 这些选项用于控制是否构建特定的程序。例如,–disable-ffmpeg 选项用于禁用 ffmpeg 程序的构建。
文档选项: 这些选项用于控制是否构建文档。例如,–disable-doc 选项用于禁用文 档的构建。
组件控制选项: 这些选项用于控制是否构建特定的组件。例如,–disable-avdevice。
2. 编写编译脚本
新版 ndk 已放弃 gcc,转而使用更高效的 clang,下述脚本以 clang 为例编译 FFmpeg 源码。
#!/bin/bash
# NDK目录
TOOLCHAIN=$NDK_PATH/toolchains/llvm/prebuilt/linux-x86_64
# 最低支持的android sdk版本
API=21
function build_android
{
echo "Compiling FFmpeg for $CPU"
./configure \
--prefix=$PREFIX \
--enable-neon \
--enable-shared \
--enable-small \
--disable-vulkan \
--disable-gpl \
--disable-postproc \
--disable-jni \
--disable-mediacodec \
--disable-decoder=h264_mediacodec \
--disable-static \
--disable-doc \
--disable-programs \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-symver \
--enable-cross-compile \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--sysroot=$SYSROOT \
--extra-cflags="-mno-stackrealign -Os -fpic -mfpu=neon $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS"
#--disable-debug
#--disable-stripping
#--disable-linux-perf
#--disable-hwaccels
make clean
make -j4
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}
function print_supported_cpus
{
echo "Supports the following CPUs:"
echo "1. armv7-a"
echo "2. armv8-a"
}
function print_usage
{
echo "Usage: $0 [CPU]"
echo "Example: $0 armv7-a"
print_supported_cpus
}
# 传入CPU参数
CPU=$1
if [ -z "$CPU" ]; then
print_usage
exit 1
elif [ "$CPU" = "help" ]; then
print_usage
elif [ "$CPU" = "armv7-a" ]; then
ARCH=arm
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$TOOLCHAIN/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/llvm-
PREFIX=$(pwd)/android/$CPU
ADDI_LDFLAGS=" "
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -march=$CPU"
build_android
elif [ "$CPU" = "armv8-a" ]; then
ARCH=arm64
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$TOOLCHAIN/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/llvm-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
build_android
else
echo "Unsupported CPU: $CPU"
print_supported_cpus
fi
–target-os=xxx :指定编译器目标 os。当我们编译用于 android 平台的库时,指定该选项为 --target-os=android
,否则编译出的 so 为软链接,真正的 so 名字后缀带有一长串的主版本号与子版本号,这样的库在 android 平台上无法识别,如下图所示:
当指定 --target-os=android
,则编译出的库如下:
–disable-vulkan: 编译时可能出现 fatal error: ‘vulkan_beta.h’ file not found
#include “vulkan_beta.h” 错误。可在使用 configure 脚本配置编译选项时,使用 --disable-vulkan
禁用 vulkan;或 extra-cflags
参数中添加 -DVK_ENABLE_BETA_EXTENSIONS=0
来防止引用 vulkan_beta.h。
3. 脚本使用说明
- 进入 ffmpeg 源码目录,并创建脚本文件:
vim build_android.sh
- 按上一章节内容编辑脚本文件
./build_android.sh help
查看脚本使用说明