基于ndk-r16b编译Android平台的FFmpeg-3.4.2和FFmpeg-4.0动态库

详细的FFmpeg编译流程与脚本分析 FFmpeg是一个跨平台的多媒体库,也是目前音视频领域应用最广泛的库。它包括llibavcodec、libavformat、libavutil、libavdevice、libavfilter、libswscale、libswresample、libpostproc等模块,其中avcodec用于编解码,avformat用于解封装,avutil是提供工具类,avdevice用于各平台的设备接入 阅读详情

问题来源

基于NDK编译Android平台的FFmpeg动态库,这件事情我们早在去年就做过了,详细的可以参考我的博文:
https://blog.youkuaiyun.com/ericbar/article/details/76602720,
但是FFmpeg的基线版本以及ndk编译链是不断更新的,近期我打算基于最新的FFmpeg版本和ndk版本编译libffmpeg.so时,又遇到了麻烦,各种编译问题。通过这两天的努力,终于编译成功了。于是,打算另起一篇新的文章,将经验和大家分享一下。

FFmpeg版本

从ffmpeg.org官网获知,现在最新的稳定版本分别是FFmpeg 3.4.2 "Cantor"和FFmpeg 4.0 “Wu”,分别下载源码ffmpeg-3.4.2.tar.xz和ffmpeg-4.0.tar.xz,并解压缩到自己的工作目录:

tar xvf ffmpeg-3.4.2.tar.xz
tar xvf ffmpeg-4.0.tar.xz

NDK版本

参考前述博文,在ndk的官方网站(可能需要科学上网)https://developer.android.com/ndk/downloads/index.html 获知最新的ndk稳定版本是r16b,于是下载 android-ndk-r16b-linux-x86_64.zip 并解压,放在 /opt 目录下。

常规办法遇到的问题

参考前述博文,将config.sh的SYSROOT,LIBPATH以及TOOLCHAIN换成对应的r16b版本,如下:

SYSROOT=/opt/android-ndk-r16b/platforms/android-19/arch-arm
LIBPATH=/opt/android-ndk-r16b/platforms/android-19/arch-arm/usr/lib/
TOOLCHAIN=/opt/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/

执行后报错,

ffmpeg@ubuntu:~/work/android/ffmpeg-3.4.2$ ./config.sh 
 
please wait...
 
 
preparing to configure...
 
/opt/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc is unable to create an executable file.
C compiler test failed.

If you think configure made a mistake, make sure you are using the latest
version from Git.  If the latest version fails, report the problem to the
ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
Include the log file "ffbuild/config.log" produced by configure as this will help
solve the problem.

分析编译链的代码结构,发现android-ndk-r16b\platforms\android-19\arch-arm\usr下只有lib文件夹,没有include文件夹,相关include头文件则位于android-ndk-r16b\sysroot\usr\include下,通过尝试修改
–sysroot=$SYSROOT指向lib路径,并添加配置选项–sysinclude指向include文件夹,configure仍然失败。

正确方法

通过搜索大量的网站,有建议说需要采用standalone的工具链来进行编译,通过尝试获得成功,下面是总结的步骤:

  1. 选择make_standalone_toolchain的方式来制作编译链;
    在刚才下载的android-ndk-r16b\build\tools目录下,有一个Python脚本make_standalone_toolchain.py,通过它可以自动生成我们需要的编译链环境;在此目录下,执行如下命令:
python make_standalone_toolchain.py --api 19 --install-dir /home/ffmpeg/work/toolchain/android/linux-x86_64/ndk-r16/android-19/arm --arch arm --stl libc++ --force

其中,/home/ffmpeg/work/toolchain/android/linux-x86_64/ndk-r16/android-19/arm是我们打算把工具链安装的路径,你可以根据自己需求自定义。另外,我们仍然选择api 19作为我们的编译版本,等待一段时间后,会自动在这个目录下生成完整的编译链,如下图所示:
生成的编译链补充一下,如果是要编译64位的so,API需要大于等于21,所以19是不满足的,其生成指令可以参考如下:

python make_standalone_toolchain.py --api 21 --install-dir /home/ffmpeg/work/toolchain/android/linux-x86_64/ndk-r19c/android-21/arm64 --arch arm64 --stl libc++ --force
  1. 有了正确的编译链后,只需要修改对应的config.sh和make.sh即可,相关目录指向调整如下(参考我的编译链路径):
SYSROOT=/home/ffmpeg/work/toolchain/android/linux-x86_64/ndk-r16/android-19/arm/sysroot
LIBPATH=/home/ffmpeg/work/toolchain/android/linux-x86_64/ndk-r16/android-19/arm/sysroot/usr/lib
TOOLCHAIN=/home/ffmpeg/work/toolchain/android/linux-x86_64/ndk-r16/android-19/arm

3.配置选项调整
从FFmpeg 3.4.2开始,配置选项里的–disable-sdl 需要修改成–disable-sdl2 。对于FFmpeg 4.0,如下几个选项需要去掉,具体变成什么配置,这次暂时不做研究,我只是简单的做了屏蔽处理:

    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \

后期有时间再研究相关配置。
4. 编译问题
事情本来到这里应该很顺利了,但是在编译源码时,遇到莫名其妙的错误:

CC      libavcodec/hevc_filter.o
CC      libavcodec/hevc_mp4toannexb_bsf.o
CC      libavcodec/hevc_mvs.o
libavcodec/hevc_mvs.c: In function 'derive_spatial_merge_candidates':
libavcodec/hevc_mvs.c:208:15: error: 'y0000000' undeclared (first use in this function)
             ((y ## v) >> s->ps.sps->log2_min_pu_size))
               ^
libavcodec/hevc_mvs.c:204:14: note: in definition of macro 'TAB_MVF'
     tab_mvf[(y) * min_pu_width + x]
              ^
libavcodec/hevc_mvs.c:274:16: note: in expansion of macro 'TAB_MVF_PU'
     (cand && !(TAB_MVF_PU(v).pred_flag == PF_INTRA))
                ^
libavcodec/hevc_mvs.c:368:23: note: in expansion of macro 'AVAILABLE'
     is_available_b0 = AVAILABLE(cand_up_right, B0) &&
                       ^
libavcodec/hevc_mvs.c:208:15: note: each undeclared identifier is reported only once for each function it appears in
             ((y ## v) >> s->ps.sps->log2_min_pu_size))
               ^
libavcodec/hevc_mvs.c:204:14: note: in definition of macro 'TAB_MVF'
     tab_mvf[(y) * min_pu_width + x]
              ^
libavcodec/hevc_mvs.c:274:16: note: in expansion of macro 'TAB_MVF_PU'
     (cand && !(TAB_MVF_PU(v).pred_flag == PF_INTRA))
                ^
libavcodec/hevc_mvs.c:368:23: note: in expansion of macro 'AVAILABLE'
     is_available_b0 = AVAILABLE(cand_up_right, B0) &&
                       ^
libavcodec/hevc_mvs.c:207:15: error: 'x0000000' undeclared (first use in this function)
     TAB_MVF(((x ## v) >> s->ps.sps->log2_min_pu_size),                     \

或者是下面这种错误,

libavcodec/aaccoder.c: In function 'search_for_ms':
libavcodec/aaccoder.c:803:25: error: expected identifier or '(' before numeric constant
libavcodec/aaccoder.c:865:28: error: lvalue required as left operand of assignment
libavcodec/aaccoder.c:866:25: error: 'B1' undeclared (first use in this function)
libavcodec/aaccoder.c:866:25: note: each undeclared identifier is reported only once for each function it appears in
ffbuild/common.mak:60: recipe for target 'libavcodec/aaccoder.o' failed
make: *** [libavcodec/aaccoder.o] Error 1

在网上找到大神的解答(http://alientechlab.com/how-to-build-ffmpeg-for-android/),原来是r16b编译链的termbits.h(实际是asm-generic/termbits.h)宏定义了B0,

#define B0 0000000

导致编译链宏定义和局部变量冲突,好大的坑!在编译链头文件里,把这个宏定义语句屏蔽即可。

最后,你应该能顺利的编译出你想要的libffmpeg.so库了。

总结

开源项目给我们带来便利的同时,也给我们带来了不少的坑,填坑是依赖开源项目开发必备的基本技能,但是,只要坚持寻找问题的各种解决办法,总会有柳暗花明的时刻到来。

Android NDK(ndk-r16b)交叉编译FFmpeg(3.3.9) 超详细编译ffmpeg3.3.9生成so库 阅读详情

相关推荐

FFMpeg 4.0.2编译

因为项目需要,需要加入视频相关的功能,那必然绕不开FFMpeg了,所以本文记录一下在在编译FFMpeg中的经验和教训。 本篇将介绍2种环境下的编译方式:MacOS和Windows使用NDK r16b + FFMpeg 4.0.2,下载地址可以百度一下。这里就不累赘了 先以MacOS为例(因为网上很多例子都是Mac下的,而我刚开始用的windows,导致出现了很低级的错误,但是一直找不到原因)。...

xiantongyuan的专栏 1873

Mac 10.15.4下面使用Android ndk-16编译ffmpeg3.4.7

最近几天想要编译ffmpeg,就是下载了最新的版本的ffmpeg4.2,结果就是无论怎么配置都是各种错误,状况百出,后来去下载了ffmpeg3.4.7,一下子就编译成功,下面在这里记录一下: 准备环境:下载ndk-16,下载ffmpeg 使用brew安装如下的文件: brew install automake brew install celt brew install faac...

guibao513的专栏 719

ubuntu 12.04 NDK + android 4.0.3_r1 编译libffmpeg.so

环境:ubuntu 12.04 、android-ndk-r8d 、 android 4.0.3_r1 编译libffmpeg.so .找个很多开源项目,,终于有一个可以编译通过了,RockPlayer http://www.rockplayer.com/download/rockplayer_ffmpeg_git_20100418.zip 解压缩到任意目录,是ffmpeg源码

mangrove0723的专栏 1205

ffmpeg编译android平台-(ubuntu+ndkr16b+ffmpeg3.4.12)

ffmpeg android平台静态库编译

知识共享,你我皆是知识的搬运工 2109

FFmpeg 4.2.2 Android平台armv7-a架构编译实战

FFmpeg 是一个开源的多媒体处理框架,具备音视频编解码、转码、流媒体处理等强大功能,广泛应用于各类音视频项目中。其跨平台特性使其在 Android 开发中尤为重要,尤其适用于构建自定义播放器、视频编辑器及直播推流应用。在 Android 平台上,FFmpeg 的适配主要包括交叉编译、动态/静态库生成、架构适配(如 armv7-a、arm64-v8a 等)以及与 JNI 的集成。

weixin_28809949的博客 1421

android-ndk-r16b

android-ndk-r16b, Android studio jni开发用ndk 包. 文件为网盘地址及密码

[Cmake-Android音视频]NDK-r14b编译ffmpeg3.4支持neon,硬解码

[Cmake-Android]音视频总结: [Cmake-Android音视频]SDK,NDK基本介绍 [Cmake-Android音视频]NDK-r14b编译ffmpeg3.4支持neon,硬解码 [Cmake-Android音视频]创建支持ffmpeg3.4的项目 [Cmake-Android音视频]ffmpeg3.4实现解封装 [Cmake-An...

adolph_lu的博客 953

excel 利用SUBTOTAL函数计算筛选后数列总和、均值、最大、最小值

表里有三个人,咱们需要筛选出三个人,并分别计算他们的总和值。 先看一下数据范围(A1:B27) 通过筛选找张三。 按照上图所示输入函数,选择9,求和。 然后按照函数输入即可。 就能计算出结果。 筛选项选择王五,就会自动计算王五的总和。 筛选到李四就会自动计算李四的总和。 如果把9改成1,就是自动计算筛选出来的均值结果,如下图所示。 如果改成4就是取筛选项的最大值,选择5就是取最小值。 ...

yuanYW7556的博客 3万+

在 Windows 7 下使用 Android NDK r5c 编译 FFmpeg 0.7.1

在 Windows 7 下使用 Android NDK r5c 编译 FFmpeg 0.7.1 2011-06-26 13:48 by Scott Wong, 1301 visits, 收藏, 编辑 在代号是 “Love”的 FFmpeg 0.8 正式版几个小时之

b02330224的专栏 3694

NCCL分布式训练中ibv_reg_mr_iova2内存分配失败的3种解决方案(附详细排查流程)

本文深入探讨了NCCL分布式训练中ibv_reg_mr_iova2内存分配失败的3种解决方案,包括快速临时修复、标准系统配置和PAM模块根治方案。详细分析了错误原因,提供了完整的排查流程和性能优化建议,帮助开发者高效解决RDMA网络环境下的内存锁定问题。

nut55的博客 625

从零构建无线AM信号模拟系统:基于STM32与AD9959的国赛一等奖方案解析

本文详细解析了基于STM32F103RCT6与AD9959芯片构建无线AM信号模拟系统的国赛一等奖方案。文章从项目背景、核心芯片选型出发,深入剖析了系统架构、硬件电路设计及软件控制逻辑,重点分享了“直流偏置叠加法”实现AM调制、多径模拟以及高频电路调试的实战经验与避坑指南,为参加全国大学生电子设计大赛的选手提供了一套完整、可靠的复现路径。

weixin_29182481的博客 181

Android编译FFmpeg4.0.2添加H264编码(FFmpeg编译二)

目前测试发现使用NDK16以上的版本编译不了FFmpeg,原因未知。 我使用的系统ubuntu18.04,先编译FFmpeg,成功之后再添加X264的库。 编译FFmpeg的脚本如下: #!/bin/bash #!/bin/bash NDK=/home/hong/Public/android-ndk-r14b SYSROOT=$NDK/platforms/android-21/arch-ar...

my11712的专栏 2749

BCIC IV 2a数据集实战:从MATLAB导入到EEG信号分析全流程

本文提供了BCIC IV 2a数据集从MATLAB导入到EEG信号分析的完整实战流程。详细解析了数据集结构,区分了EEG与EOG信号,并演示了信号可视化、基础预处理(滤波、分段、基线校正)等关键步骤,帮助脑机接口研究者快速上手处理这一经典运动想象数据集。

weixin_29047919的博客 469

NDK R20编译Ffmpeg集成Android命令

本次编译环境为windows,linux和mac大同小异(windows都异类了,其他环境编译没啥问题) 下载好MINGW,咋个配置的,百度吧,忘了。 下载好NDK文件,我是R20版本的;在从ffmpeg的官方下载源码,版本4.2.2 脚本编译 ffmpeg从四点几开始的不想了解了,就已经默认对android编译进行了设置。 也默认开启了clang编译 所以只需要写个编译脚本就van事了。 #......

Krisez的博客 1692

FAST-LIO 实战:从 LI-Init 标定到 YAML 配置全解析

本文详细解析了FAST-LIO算法中LI-Init标定的关键步骤与YAML配置优化技巧。从激光雷达与IMU的时空标定原理到实战参数调优,提供了一套完整的解决方案,帮助开发者解决点云畸变、建图漂移等常见问题,提升SLAM系统在动态环境中的稳定性和精度。

weixin_42651281的博客 326

Android Jetpack 最全面试题及参考答案

要使用 WorkManager 定义一个异步任务,以下是详细步骤。首先,需要创建一个继承自 Worker 类的自定义类,这个类代表了要执行的具体任务逻辑。// 在这里编写具体的任务逻辑,比如从网络下载文件try {在上述代码中,doWork方法就是任务的核心执行逻辑所在,这里模拟了从给定的 URL 下载文件到本地的操作,若下载成功返回,若出现异常则返回。然后,在需要调度任务的地方,比如在某个 Activity 或者 Fragment 中,通过构建 WorkRequest 来安排任务执行。

大模型大数据攻城狮的专栏 1895

Ubuntu18.04下编译FFmpeg for Android

模仿、求学都不是我们的目的,最终我们都希望在求知的过程中,有所领悟。最终走出自己的道。淡定、从容,如果不是刻意伪装,相信当事者必有丰富的人生阅历。把学习记录下面,不仅是为了备忘,更是对学习过程的梳理。当我们可以站在过去的肩膀上,又可以很好地向别人表达自己的思想。相信我们的人生一定会更加精彩。道路维艰,且让我们脚踏实地,步步为营。 下面的文章参考了众多博客,亦夹杂了个人在编译过...

n_fly的博客 1265

互联网的发展简史—web

互联网是我现在生活所离不开的一个东西,但是你知道互联网的前世今生吗?本文将讲解互联网的发展史,以及很火的元宇宙概念。

yj11290301的博客 3561

android ndk r14b安装,[Cmake-Android音视频]NDK-r14b编译ffmpeg3.4支持neon,硬解码

编译环境Ubuntu16.04 x86_64Ffmpeg3.4ndk-r14b编译前的准备ubuntu16.04 64位linux下载ndkubuntu下载ffmpegbash查看ubuntu的版本是32位仍是64位编辑器uname -aandroid-ndk须要和ubuntu版本的位数保持一致ide安装make工具apt-get install make安装vimpostapt-get inst...

weixin_42504327的博客 660

SwiftUI 5 教程之 SwiftData使用入门(教程含源码)

对我来说,记住日期很难。是的,您可以设置该日期的提醒,但该提醒无法产生紧迫感。让我们创建一个应用程序,我们可以在其中添加将来发生的事件。如果我们可以在主应用程序上看到所有即将发生的活动,那就太好了。也许将它们添加到小部件上以营造紧迫感。对于任何事件,我们需要跟踪哪些事情?我们将在下一篇文章中添加更多属性,其中我们将讨论迁移。现在,这就是我们所需要的。开始吧。

iCloudEnd的博客 987

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

在 Ubuntu 下使用 Android NDK r4b 编译 FFmpeg 0.6.3

在我写这篇随笔之前,你可以 Google 到几篇教你如何使用 NDK 编译 FFmpeg 的文章。但让人沮丧的是,当你按着文章中给出的方法去尝试编译 FFmpeg 时,你总是不能编译成功。你会遇到各种各样的错误,它们会让你渐渐丧失信心。   我总结了一下导致编译失败几个原因: Google 提供的 NDK 有 BUG,需要修改 build-binary.mk 文件 编译方法

1333

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

mac下 ffmpeg 编译到android平台(支持 frei0r)

#!/bin/bash # set the base path to your Android NDK (or export NDK to environment) if [[ "x$NDK_BASE" == "x" ]]; then NDK_BASE=/Users/zd/androidStudio/ndk/android-ndk-r10e echo "No NDK_BASE

asd520881111的博客 1498

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

FFmpeg编译为so库导入安卓开发

本文主要阐述如何获取ffmpeg源码并进行交叉编译,并编译成安卓平台所需so库

分享音视频技术 1744

FFmpeg—Linux编译FFmpeg动态库(一)

https://www.jianshu.com/p/e4b862e6fd7e 如果需要学习FFmpeg,则需要学会编译FFmpeg,在安卓开发中,一般是将FFmpeg的源代码编译成动态库供安卓项目调用。这里编译FFmpeg可以用Linux和Mac,这里只介绍Linux的编译FFmpeg的情况。 1、在这之前需要做的准备工作: 准备一个Linux系统 了解Linux的shell脚本 了解L...

chenxiuli0810的专栏 2182

保姆级教程:在Mac/Linux上为Android编译FFmpeg 4.2.2动态库(NDK r20b + clang)

本文详细介绍了在Mac/Linux环境下使用NDK r20b和clang工具链为Android编译FFmpeg 4.2.2动态库的完整流程。从环境配置、编译脚本定制到常见问题排查,再到Android Studio集成与验证,提供了全面的音视频开发解决方案,帮助开发者高效构建定制化的FFmpeg动态库。

weixin_30861797的博客 401

NDK r21下编译ffmpeg

@音视频 NDK r21下编译ffmpeg 下载NDK 从NDK官网下载NDK,并上传到服务器任意目录,本文上传到/home/syq目录中。 当前最新稳定版为r21b。 从NDK导出工具链 cd /home/syq/android-ndk-r21b #NDK的安装目录 ./make-standalone-toolchain.sh --platform=android-24 --install-dir=/home/syq/android-toolchain --force #生成工具链 编译脚

weixin_46743223的博客 639
上一篇: 关于媒体编解码以及封装那点事
下一篇: 基于eclipse进行ndk开发的环境配置
ericbars
博客等级 码龄10年 120粉丝 30原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值