Ubuntu 20下基于NDK 24编译 FFmpeg5.0 64位版本

1,294 阅读2分钟

前言

本文章是在我编译 FFmpeg 时总结出来的一些方法以及踩坑记录,主要现在网上很多教程所使用的编译脚本都存在或多或少的问题,我主要是在前辈的基础上进行些许优化,有问题欢迎大家讨论

环境配置

这个就不多说了
操作系统:Ubuntu 20.04.4
NDK r24
FFmpeg 5.0
ndk我是直接通过Android studio下载的,也可以单独下载
接下来就需要配置NDK环境,这个也比较简单,不过多赘述

vim etc/profile
#输入你自己的ndk路径
export NDK_HOME=/Android/Sdk/ndk/24.0.8215888

测试:

ndk-build -v

出现如下提示则表示成功:

20220408104816.png 若没有成功,可能需要赋予文件夹权限:

chmod 751 -r 目录名称

编译FFmpeg

进入官网下载 5.0 版本后解压,并赋予改目录权限,之后我们开始编写编译脚本
执行命令:

vim ffbuild.sh

输入以下内容:

#!/bin/bash

#此处 NDK_HOME 为环境变量
#我的路径是 /Android/Sdk/ndk/24.0.8215888
NDK_ROOT=$NDK_HOME

echo "<<<<<<<<<<<<<基于NDK24编译 FFmpeg 5.0 64位硬件解码版本>>>>>>>>>>>>>>"

#设置编译平台的相关参数
CPU=armv8-a
ARCH=arm64
OS=android
PLATFORM=aarch64-linux-android
OPTIMIZE_CFLAGS="-march=$CPU"


#指定输出路径
PREFIX=$(pwd)/android/aarch64
#此处 TOOLCHAIN 为环境变量
#我的路径是 /Android/Sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/linux-x86_64
SYSROOT=$TOOLCHAIN/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/llvm-
#CROSS_PREFIX=$TOOLCHAIN/bin/$PLATFORM-
ANDROID_CROSS_PREFIX=$TOOLCHAIN/bin/${PLATFORM}21-


echo "开始编译 $CPU"
#该脚本命令中不能插入注释,每行命令必须以 \ 结尾
./configure \
--prefix=$PREFIX \
--enable-shared \
--enable-gpl \
--enable-neon \
--enable-hwaccels \
--enable-postproc \
--enable-jni \
--enable-small \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffplay \
--disable-avdevice \
--disable-debug \
--disable-static \
--disable-doc \
--disable-symver \
--cross-prefix=$CROSS_PREFIX \
--target-os=$OS \
--arch=$ARCH \
--cpu=$CPU \
--cc=${ANDROID_CROSS_PREFIX}clang \
--cxx=${ANDROID_CROSS_PREFIX}clang++ \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fPIC $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \

make clean
#编译
make
#安装
make install

echo "编译完成 $CPU"

在使用前需要将脚本所指定的路径更改位你自己的ndk路径,之后最好保证你的系统已经安装了gcc以及yasm(已经安装了可以忽略),执行如下命令:

#更新
sudo apt-get update
#安装工具包
sudo apt-get install yasm 
sudo apt-get install build-essential

下面是一些关于该脚本的注意事项:
1、路径需要更改为自己的ndk下的路径
2、./configure的配置参数可以根据自己的需求来设定,具体可以点开ffmpeg解压后的文件夹下的 configure 查看
3、如果需要编译32位版本,更改对应的参数即可

ARCH=arm 
CPU=armv7-a 
PLATFORM=armv7a-linux-androideabi
PREFIX=$(pwd)/android/$CPU 
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "

执行脚本

将脚本放到ffmpeg的目录下,运行命令执行

sh ffbuild.sh

之后便会开始编译 ffmpeg

编译过程中遇到的坑

1、xxxx-clang is unable to create an executable file.

20220408114232.png
这种通常是路径问题,务必仔仔细细检查一下路径的配置是否正确

2、--某某指令: not found

20220408114654.png
检查脚本中指令换行后是不是以 \ 结尾,或指令中时候有其他无用字符
3、./configre: xxxxxxx-nm not found或 xxxx-strip not found等

20220408115058.png

20220408120018.png 出现类似上面这样的我们可以观察到它打印出来的路径下并没有对应的工具,但是我们可以在目录下找到llvm前缀的工具,如 llvm-nmllvm-strip等,这些工具的前缀是通过 --cross-prefix=指令来指定。网上的很多脚本都是用的armv7a-linux-android这样的前缀,那肯定是找不到的,这应该是以前版本的做法,所以我给的编译脚本中将它改成了$TOOLCHAIN/bin/llvm-,这样就没问题了。
当然,如果这样任然出现某某 not found 的话,我们也可以单独为该工具指定路径,
如 出现xxx-strip not found ,我们可以添加一条指令来指定 strip工具的路径,如下:

STRIP=$TOOLCHAIN/bin/bin/llvm-strip
./configure \
.... \
--strip=$STRIP \

总结

本文只是在前辈的基础上做的一些更改优化以及一些踩坑记录,需要更详细的介绍可以去看大佬的# 一键编译 32/64 位 FFmpeg 4.2.2