ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

ffmpeg4.4在Linux下使用android NDK 21新版本编译及其问题解决

2021-06-03 17:33:46  阅读:517  来源: 互联网

标签:NDK shell ffmpeg ASFLAGS dev 编译 so Linux 21


一、可参考英文官网
https://trac.ffmpeg.org/wiki/CompilationGuide/Generic
【安装编译、更新、移除】https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu#RevertingChangesmadebythisGuide
https://trac.ffmpeg.org/wiki/CompilationGuide
https://trac.ffmpeg.org/

二、下载步骤

备注:可参考官网【安装编译、更新、移除】

安装依赖脚本,并执行它:【若有已安装的可去掉】

sudo apt-get update -qq && sudo apt-get -y install \
  autoconf \
  automake \
  build-essential \
  cmake \
  git-core \
  libass-dev \
  libfreetype6-dev \
  libgnutls28-dev \
  libsdl2-dev \
  libtool \
  libva-dev \
  libvdpau-dev \
  libvorbis-dev \
  libxcb1-dev \
  libxcb-shm0-dev \
  libxcb-xfixes0-dev \
  meson \
  ninja-build \
  pkg-config \
  texinfo \
  wget \
  yasm \
  zlib1g-dev

在自己的home目录中创建:
mkdir -p ~/ffmpeg_sources

然后直接在官网下载最新tar.gzip压缩包版本,放入linux ffmpeg_sources 中解压出来,进入ffmpeg根目录,创建build_android.h,内容如下可参考别人写的利用NDK(r20) 编译FFmpeg 4.2.1 Android版本,也可参考官网自行优化。

但他这边文章有一个错误配置:
如下,即文中的 --arch=arm64 应该写为:–arch=aarch64

–arch=xxx的参数列表在ffbuild/config.log里面会所有支持的arch列表:
ARCH_LIST=’
aarch64
alpha
arm
avr32
avr32_ap
avr32_uc
bfin
ia64
m68k
mips
mips64
parisc
ppc
ppc64
s390
sh4
sparc
sparc64
tilegx
tilepro
tomi
x86
x86_32
x86_64

三、编译步骤
linux版本编译直接参考官网即可:

Linux下必须安装 yasm汇编器【nasm】对ffmpeg中的汇编部分进行编译,默认配置会使用它,否则报错。

ffmpeg源码目录下,首先执行 ./configure ,看是否一切正常,正常将不会报错,还可以看到许多配置信息。
注意修改编译脚本编译结果为so库,而非静态库。

执行上面的编译脚本,等待编译结果在当前目录的android_shared目录中生成。

备注:多核CPU可使用make -j4来提升编译速度,4表示4核。或者使用 make -j$(nproc) 来适配本机可使用的核数

linux版本编译结果时可在最后使用 ffmpeg命令行来验证编译结果,执行 ./ffmpeg.exe -h ,将会出现ffmpeg安装配置信息。

安卓交叉编译:
直接参考别人写的很不错的文章利用NDK(r20) 编译FFmpeg 4.2.1 Android版本

本文主要记录编译错误和运行错误问题

四、编译失败问题
编译时报错:
Makefile执行过程中出错:make: *** No rule to make target ` ‘, needed by xxx. Stop.
需要去掉 --disable-fserver 配置

注意:xxx : command not found
如–disable-doc: command not found 这种指令找不到错误时,就是shell脚本的该行命令上面写了注释但最后用了 \ 反斜杠,必须去掉

错误:
1、libavfilter/af_acrossover.c:42:9: warning: ‘B0’ macro redefined [-Wmacro-redefined]
#define B0 0
改为B00

2、libavfilter/af_aecho.c:188:9: warning: ‘ECHO’ macro redefined [-Wmacro-redefined]
#define ECHO(name, type, min, max)
改为ECHO2

3、若出现WARNING:/root/android-ndk/…/arm-linux-androideabi-pkg-config not found, library detection may fail. 可忽略。

ffmpeg库在安卓上运行错误:
java.lang.UnsatisfiedLinkError: dlopen failed: library “libclang_rt.ubsan_standalone-aarch64-android.so” not found。
必须将交叉编译下的该so库拷贝出来和ffmpeg的同CPU库一起加载
至于原因,我也不清楚为啥需要这个独立库?,我也不想要这个库,有同学知道原因还请指出

XXX、随记
2016年初,ffmpeg自身AAC编码器质量变好,年底将此前的libfaac替换为新的自身的libfdkaac,并从源码中移除。
ffmpeg全部支持的话,so库比较大,可以通过裁剪操作来去掉一些不需要的编码、封装或协议等。可以在关闭所有的模块之后单独定制支持自己所需的模块。

“ARMv8-A”是指AArch64,带有A64指令集,也称为arm64或ARM64。

android.mk 和 Makefile中打印变量
$(warning $(DVD_SERVICE)) // DVD_SerVICE是Makefile中的变量

Makefile中宏AS一般代表汇编语言编译器,ASFLAGS一般代表编译汇编语言代码时的编译选项
AS和ASFLAGS都是环境变量。
${xxx}就是取出环境变量的值。
makefile中,AS环境变量一般放的是汇编器的名称,ASFLAGS是汇编参数。
于是
${AS} A S F L A G S 就 是 一 条 用 {ASFLAGS} 就是一条用 ASFLAGS就是一条用{AS}汇编器传${ASFLAGS}汇编参数的汇编指令,跟上汇编源文件就一条完整的汇编命令语句了。

BUILD_PREBUILT 是预置so到源码指定out目录中,然后成为系统so来访问

而 PREBUILT_SHARED_LIBRARY 却是AS中使用的:NDK 支持使用预编译库
https://www.cnblogs.com/gamesky/p/11369172.html 可参考

shell脚本中打印
echo “canshu2:${analysis_date}”

shell中写的 export命令将变量myfile输出至任何子shell,例如当执行父脚本程序时产生的子shell。
也就是说调用的子shell可以直接使用父shell中变量,所以如果你执行在当前shell中定义变量使用,则不需要写export

标签:NDK,shell,ffmpeg,ASFLAGS,dev,编译,so,Linux,21
来源: https://blog.csdn.net/u012430727/article/details/117529413

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有