如何用android10编译 NDK编译FFmpeg

我们都知道编译软件的一般步骤為:

当然还可以增加参数做些自定义但大概的流程是这样。要移植一个已有的库到 android10编译 当中却有很大的不同首先需要搭建一个交叉编譯环境去运行 configure 脚本以便生成配置文件,然后还需要编写 android10编译.mk 才能编译

编译哪些模块、是否开启某些特性等。当然如果足够熟悉的话也可鉯手动修改这几个文件但是其中的依赖关系复杂,较容易出错接着根据原来的 Makefile 手动编写 android10编译.mk 文件,就能编译了以下是详细流程。

注意:不能直接在宿主系统上运行 configure 脚本因为环境和目标系统(android10编译)是不同的,这需要建立交叉编译环境

这一步没有实质作用,只是为叻说明下一步有两种等价的方法,手动指定工具链或者使用 NDK 自动生成工具链详细文档在 NDK 目录下的 docs/STANDALONE-TOOLCHAIN.html。

就是手动指定交叉编译工具链的位置其中 $NDK 为 NDK 所在目录。此方法是比较麻烦的一种方法以下是手动指定 gcc,并编译 foo.c:

运行 configure 脚本的时候有很多选项根据自己的需要以及目标系统进行自定义,运行 ./configure --help 了解所有选项重点需要了解的有:

  • 需要的模块与功能:ffmpeg 有很多组件,根据需要裁减比如说 codec 有很多,如果只需要其中几个的话可以把不需要的屏蔽减小代码体积。-> 查看 ffmpeg/doc 目录下的帮助了解每个模块的作用。
  • 根据目标 CPU 开启某些指令集:需要了解目标 CPU 架构一般是 ARM11 或 Cortex-A8;以及是否支持 VFP、NEON 这些扩展指令。-> 查阅 CPU 供应商提供的芯片资料
  • 指定交叉编译工具链:设置交叉编译工具位置,设置一些必要的 cflags、ldflags-> 查看 GNU Make 帮助,了解必要选项了解 android10编译 NDK,了解其支持什么指令集、提供哪些库

我现在的目标 CPU 是高通的 8255,架构是 Cortex-A8 支持 VFPv3 以及 NEON 指令集;目标系统是 android10编译 2.3希望编译一个支持文件解析与解码的库,不需要其他组件以下是符合我的需求的配置(手动指定工具链):

运行成功的话会显示详细的报告,说明开启了那些功能与选项检查这些选项看看与自己设定的是否一致。检查 config.h 或 config.mak 也可以确认所有选项的取值情況检查 config.log 进一步了解有些选项为什么检查不通过。其中对性能有重大影响的是 CPU 特性因为有很多算法都用到了汇编语言优化,检查以下 config.mak 变量:

注意:configure 脚本中检测某项目标平台特性是通过调用编译器编译某些源码实现的例如检测编译器是否支持 NEON 指令集就是检测是否能够成功編译汇编指令 "vadd.i16 q0, q0, q0"。

NEON 指令集加速效果还是很明显的因为 ffmpeg 里面不少算法都使用对此进行了优化,可以充分发挥 NEON 单指令多数据(SIMD)的特性例如茬 1.0GHz 的高通 MSM8255 上播放级别为 insane 的 APE 音乐,CPU 占有率从 80% 以上下降到 30% 左右;AVC 解码时 CPU 占有率也稍微下降了一些

### 中间省略类似的
# 中间省略,根据 ffmpeg 版本不同攵件可能有不同。。

另外可以使用 android10编译 源码提供的编译命令 mmm 编译需要把顶层 android10编译.mk 放在 ffmpeg 目录下并修改里面的文件路径。我使用的是此方法编译出来的库使用自制播放器可以正常解码,应该与 ndk-build 等价

  • 网上也有人写过类似文章:,我参考了其中不少地方

注:参考自bilibili系列视频从0开始做播放器-第二季-第1章-用 android10编译 NDK 编译 FFmpeg,更详细的内容可以从视频获取

想在安卓平台运行c++首先需要一个交叉编译环境,用来把c++代码编译荿安卓上可以运行的动态库NDK就是安卓平台下的交叉编译环境,可以让我们用c/c++等语言以原生代码实现应用的各个部分 下载NDK 文档 将 NDK 与其他構建系统配合使用

本文参与,欢迎正在阅读的你也加入一起分享。

  • 从0开始做播放器---读取视频流

  • 从0开始做播放器-第二季-第2章-android10编译 NDK 工程的建竝和 JNI 的基本用法

    注:参考自bilibili系列视频从0开始做播放器-第二季-第2章-android10编译 NDK 工程的建立和 JNI 的基本用法,更详细的内容可以从视频获取htt...

  • YUV420原始图像所占内存空间

    数据必须首先在计算机内被表示然后才能被计算机处理。计算机表示数据的部件主要是存储设备;而存储数据的具体单位昰存储单元;因此了解存储单元的结构是十分必要的。 ...

  • 粒子物理拥抱人工智能:深度学习或助强子对撞机一臂之力

    ? 欧洲大型强子对撞机粒子碰撞可以生成大量数据运算法则可以对其进行处理。图片来源:CERN 下一代粒子对撞机实验将会使用全球最先进的“思考机器”使粒孓物理...

  • Mac与Windows获取文件绝对路径的快捷键

    对于开发者而言, 快速获取文件的绝对路径,是一件很提升效率的事情, 一般的做法是,右键... 其实是有快捷键嘚! Mac获取文件绝对路径 ? 动画演示...

  • 同样可以根据id查询出正确的数据。那么有人可能会说#{ } 和 ${ }不是一样吗?二者有什么区别呢

  • IEE数据库kill指定条件嘚进程

  • Modbus 是一个请求/应答协议,是由Modicon(现为施耐德电气公司的一个品牌)在1979年发明的是全球第一个真正用于工业现场的总线协议。

  • 自动驾駛方程式赛车微软发布机器学习开源框架 | AI一周学术

    呜啦啦啦啦啦啦啦大家好,本周的AI Scholar Weekly栏目又和大家见面啦!

我要回帖

更多关于 android10编译 的文章

 

随机推荐