Android ffmpeg4.1 arm64位库裁剪

2023-11-05

                           ffmpeg4.1 Android arm64位库裁剪移植

目录

                           ffmpeg4.1 Android arm64位库裁剪移植

1、绪言:

2、编译环境:

3、源代码下载:

4、编写编译脚本:

4.1 编译脚本

4.2 常见问题

5、库裁剪:

5.1 裁剪原理

5.2 裁剪方法

5.3 编译配置脚本

5.4 裁剪结果

6、引用


1、绪言:

ffmpeg是一个很强大的多媒体开源框架,几乎所有的音视频播放、编辑软件都用到,如抖音、斗鱼、学习强国等。因为他的强大所以造就了他的复杂。手头有个项目刚好需要用到ffmpeg。

google将在2019年8月份强制要求所有Android设备支持64位的库,之前32位的库可以很好的兼容64位的手机,很快所有含有jni库的APP都要支持起来。姑且不论中美贸易战结果如何,华为等手机是否放弃android。

鉴于上述原因,所以要重新编译裁剪ffmpeg,在这个过程中遇到了一些问题顺便记录下来。

 

2、编译环境:

操作系统:ubuntu 14.04

交叉编译工具:android-ndk-r14b

Android NDK 下载地址

这里推荐使用ubuntu而不是用cygwin,因为ffmpeg是C语言,编译脚本是MakeFIle,很多文件对空格换行等其他字符编码敏感。

 

3、源代码下载:

下载地址:
(1) ffmpeg官网下载地址
(2)github上FFmpeg的下载地址

4、编写编译脚本:

4.1 编译脚本

在编译之前需要配置很多项,最基本的配置是要:

(1)指定工具链;

(2)一些target-os的头文件;

(3)输出的路径;

(4)输出的可执行程序和库;

这些内容是通过根目录下的configure脚本配置的,因为配置项比较多所以最好写成一个脚本。下面是一个简单例子:

#!/bin/bash
API=14
NDK=/NDK安装位置/android-ndk-r14b
SYSROOT=$NDK/platforms/android-$API/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
function build_one
{
./configure \
  --prefix=$PREFIX \
  --disable-shared \
  --enable-static \
  --cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
  --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
  --target-os=linux \
  --arch=arm \
  --enable-cross-compile \
  --sysroot=$SYSROOT \
  --extra-cflags="-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm -march=armv8-a" \
  --enable-neon

make clean all
make 
make install
}
CPU=armv64
PREFIX=$(pwd)/android/$CPU
build_one

在根目录下新建一个文件build_android.sh,将上述脚本文本复制到这个脚本中

chmod a+x build_android.sh

4.2 常见问题

(1) 这个过程中一般会遇到一些comand not found的问题,

导致原因及解决办法:

a、脚本在Windows系统下生成。这类问题可一在linux 下执行doc2unix build_android.sh;

b、主要是上述脚本中在有不合法的空格,如:“--prefix=$PREFIX \    ”后面有空格。这个需要删除空格;

c、在configure 配置项中有#注释的类容。configure是一条命令,后面都是参数,参数之间不能注释,否则无法解析。

 

(2)configure会在编译之前检验编译器是否正确如图4-1。当target-os=android时候,ffmpeg选择clang编译器,但是在ndk的交叉工具链中没有aarch64-linux-android-clang。

图4-1 编译器错误

 解决办法:修改configure如下

set_default target_os
if test "$target_os" = android; then
    #cc_default="clang"
    cc_default="gcc"
fi

关于其他的一些配置问题,通过看ffbuild/config.log和configure脚本都可以找到解决办法。

 

5、库裁剪:

5.1 裁剪原理

ffmpeg裁剪就是把ffmpeg中你不需要用到的逻辑在编译时候去掉,每个项目的需求都不尽相同,所以完成这个工作的前提是要对自己项目业务有足够的了解,并且也要清楚ffmpeg处理的逻辑。

FFmpeg是一套可以用来记录、转换、分析处理数字音频、视频,并能将其转化为流或文件的跨平台开源计算机程序。ffmpeg常用的多媒体编解码处理方面,处理流程如图5-1.

图5-1 ffmpeg编解码流程图

按照蓝色箭头指向的顺序,从外部协议接收下来的数据依次经过解协议,解封装,解码,像素转换,编码,封装,发送这几个步骤。这些步骤按照处理数据类型的不同,可以分成几个层次:

    协议层(Protocol Layer):该层处理的数据为符合特定流媒体协议规范的数据,例如http,rtmp,file等。
    封装层(Container Layer):该层处理的数据为符合特定封装格式规范的数据,例如mkv,mp4,flv,mpegts,avi等。
    编码层(Codec Layer):该层处理的数据为符合特定编码标准规范的数据,例如h264,h265,mpeg2,mpeg4等。
    像素层(Pixel Layer):该层处理的数据为符合特定像素格式规范的数据,例如yuv420p,yuv422p,yuv444p,rgb24等。

由于多媒体协议格式复杂,所以强大的ffmpeg在以上各层都支持了很多,ffmpeg裁剪就是把上面不需要支持的协议格式在编译时候禁用。

5.2 裁剪方法

在ffmpeg根目录下执行:

./configure --help

 可以看到很多配置项,裁剪的具体方法就是依次按照上面四层设置启用/禁用这些配置项。这里以decoder配置为例介绍一下:

..
--disable-decoders \
--enable-decoder=aac \
--enable-decoder=flv \
--enable-decoder=h264 \
--enable-decoder=mp3* \
--enable-decoder=hevc \
..

首先通过--disable-decoders 禁用所有解码器,然后依次启用你所需要的解码器。协议层,封装层、像素层都是类似的配置。

关于configure 的配置项一些中文翻译可以参考ffmpeg裁剪

5.3 编译配置脚本

下面是我完成版裁剪配置编译脚本,可按照第4章方法添加到工程。

#!/bin/bash 
# build_android.sh
NDK=/home/xxx/Android/android-ndk-r14b


function build_android {
 echo "Compiling FFmpeg for $CPU" 
./configure \
--prefix=$PREFIX \
--enable-neon \
--enable-shared \
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--disable-static \
--disable-doc \
--enable-small \
--disable-gpl   \
--disable-programs \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--disable-symver \
--disable-filters \
--disable-avdevice \
--disable-network \
--disable-zlib \
--disable-bsfs \
--disable-muxers \
--enable-muxer=mp4 \
--disable-demuxers \
--disable-decoders \
--enable-decoder=aac \
--enable-decoder=flv \
--enable-decoder=h264 \
--enable-decoder=mp3* \
--enable-decoder=hevc \
--disable-encoders \
--enable-encoder=png \
--enable-encoder=jpeg2000 \
--enable-encoder=mpeg4 \
--enable-version3 \
--cross-prefix=$CROSS_PREFIX \
--sysroot=$SYSROOT \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--enable-cross-compile \
--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS " \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
echo "configure finished"
make clean 
make -j4
make install 

}

#arm64-v8a 
ARCH=arm64
CPU=armv8-a 
TOOLCHAIN=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64
SYSROOT=$NDK/platforms/android-21/arch-arm64/ 
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android- 
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"

#armeabi-v7a 
ARCH=arm
CPU=armv7-a 
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
SYSROOT=$NDK/platforms/android-19/arch-arm/
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-marm"
export TMPDIR=$(pwd)/temp
build_android

 当执行以上脚本时会在终端输出配置结果如图5-2,这个结果和脚本中一致。

图5-2 裁剪库配置结果

5.4 裁剪结果

运行第4章脚本和5.3章脚本库大小结果对比如图5-3.

图5-3 库裁剪前后大小对比

6、引用


https://blog.csdn.net/leixiaohua1020/article/details/44556525

http://www.cnblogs.com/yulang314/p/3719897.html
https://www.jianshu.com/p/9ee83933009a
https://blog.csdn.net/gobitan/article/details/22750719

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android ffmpeg4.1 arm64位库裁剪 的相关文章

  • 已发布的 Flutter 应用程序在启动时崩溃

    编辑 此问题的解决方案是将您的 flutter 版本升级到较新的 dev 版本 then 1 7 0 您还可以上传单独的 APK 版本 但我个人不喜欢这个选项 请确保您没有从 flutter github 开发存储库下载 错误的构建 因为那
  • 在 Android 中创建和使用 9 补丁图像

    我最近听说了 9 补丁图像 我知道它是 9 平铺的并且是可拉伸的 我想了解更多 如何创建 9 块图像 有什么工具吗 我可以通过 AndroidSDK 或代码创建它吗 9 patch 相对于普通 png 的主要优点 它是否可以根据屏幕动态 自
  • 单击 RecyclerView 内的 ImageView 时更改图像资源

    每当我单击它时 单击图像 而不是项目 我都会尝试更改回收器视图内特定位置的设备图像资源 我尝试将 setOnClickListener 放入 onBindViewHolder 方法中 但只有最后一个项目受到影响 这是我的回收者视图 http
  • Android中如何使用洪水填充算法?

    我是Android编程新手 最近尝试编写一个简单的应用程序 仅供练习 在这个中 我想在用户点击时为图像着色 但我不知道如何开始 我读过不同的主题 其中提到使用 洪水填充 算法 我在网上找到了它 但我不知道如何将它放入我的简单应用程序中 我找
  • 如何在出现“无法解析放置符号”错误时向哈希图添加键和值

    我正在与安卓工作室 https en wikipedia org wiki Android Studio1 4 1 我刚刚创建了一个 Hashmap 并正在遵循有关如何填充和操作它的教程 Java 语言 但是 我收到 无法解析符号放置 错误
  • Android Studio - 如何关闭“单词‘word’中的拼写错误?”

    当命名变量或给出字符串参数时 Android Studio 似乎对我如何标记事物有问题 有办法把它关掉吗 是的 打开Preferences gt Editor gt Inspections gt Spelling gt 关闭Typo并按OK
  • android 确定设备是否采用从右到左的语言/布局

    有没有办法确定设备是否使用从右到左的语言 例如阿拉伯语 而不是从左到右的语言 英语 与较旧的 API 级别 低至 10 兼容的东西是必要的 SOLUTION 我最终在接受的答案中使用了 xml 方法 接下来 我还添加了此处指示的代码 以应对
  • 从多个选项卡中的编辑文本字段获取文本

    我正在尝试创建一个使用选项卡作为输入表单的 Android 应用程序 基本上 我希望对其进行设置 以便用户可以在一个选项卡上输入一些信息 然后提交该信息 或者转到另一个选项卡并输入更多信息 然后从两个选项卡提交信息 我正在使用操作栏和片段来
  • 如何从android获取应用程序安装时间

    我尝试了一些方法 但没有成功 请帮助我 PackageManager pm context getPackageManager ApplicationInfo appInfo pm getApplicationInfo app packag
  • Integer.parseInt("0x1F60A") 以 NumberformatException 结束

    我尝试从数据库中获取长字符串内的表情符号代码 格式如下 0x1F60A 所以我可以访问代码 但它将是String 起初 我尝试通过执行以下操作来转换变量tv setText beforeEmo getEmijoByUnicode int e
  • 如何在android中的操作栏中创建Edittext?

    我们可以在操作栏中使用编辑文本吗 在阅读了 Google 中的大量资源后 我找不到如何在操作栏中创建编辑文本 谁能告诉我该怎么做 您可以设置自定义View为了ActionBar像这样 getActionBar setCustomView R
  • 在 AppAuth-Android 中注销

    我有一个用JAVA开发的Android应用程序 对于这个应用程序 我使用的是身份服务器4 https github com IdentityServer IdentityServer4作为我的 STS 一切正常 但我找不到任何注销的实现Ap
  • 通过列表视图检查动态生成的复选框时遇到问题

    我知道其他成员已经提出了这个问题 一些成员也给出了解决方案 但问题是我没有找到任何适合我的应用程序的解决方案 我正在创建一个应用程序 其中我有一个屏幕 它将显示动态列表视图 其中包含列表项 复选框和三个文本视图 一个用于候选人姓名 另外两个
  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • 在 Android 中上传文件出现内存不足错误

    我的上传代码如下 String end r n String twoHyphens String boundary try URL url new URL ActionUrl HttpURLConnection con HttpURLCon
  • Android:确定 2.2 及更高版本上的摄像头数量

    我的应用程序需要在 Android 2 2 及更高版本上运行 我需要一种方法来确定可用摄像机的数量 有很多帖子解决了这个问题 但我找不到一个有效的 一种解决方案是简单地检测操作系统版本 任何 2 2 版本的设备都仅限于 1 个摄像头 即使该
  • 在 Android 布局 xml 文件中使用字符串格式参数 [重复]

    这个问题在这里已经有答案了 我在 String xml 文件中定义了一个使用格式参数的字符串 即
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • [cocos2d-x]当我尝试在 Windows 10 中运行“python android-build.py -p 19 cpp-tests”时出现错误

    当我尝试运行命令时python android build p cpp tests 我收到如图所示的错误 在此之前 我收到了另一条关于 Android SDK Tools 版本兼容性的错误消息 所以 我只是将 sdk 版本从 26 0 0
  • 异步更新后更新Android Listview

    我正在将 HTTP 调用从同步调用转换为异步调用 由于连接在后台运行 因此当我最初设置列表适配器时 数据不存在 如何在 HTTP 调用后更新列表适配器 我尝试了一些方法 例如在数据发送回之前不设置适配器并再次设置适配器 但没有任何效果 这是

随机推荐

  • 定时删除centos服务器日志

    现在java程序的日志一般是使用log4j slf4j 来打日志 并且一般都喜欢用DailyRollingFileAppender模式 就是每天产生一个日志 还有一种是 RollingFileAppender模式 这个模式是按文件大小来保存
  • QT 实现五子棋

    1 程序简介 五子棋是一款大家都熟系的小游戏 这里给大家一步一步的详细介绍如何用QT开发这个游戏 并通过这款游戏的开发练习 进一步熟系 qvector qpoint qpainter QMouseEvent 产生工具栏等的用法和方法 2 程
  • 小学生报编程机器人有什么益处

    小学生报编程机器人有什么益处 小孩子的学习一直都是很多家长们非常关心和重视的一件事情 很多的家长在培养孩子的学习方面也可以说是相当的耐心的 就拿现在很多的家长想要孩子去学习机器人编程的课程来说 有的家长对于孩子学习机器人编程的好处并不是很清
  • 信号集(未决信号集,阻塞信号集)

    未决信号集和阻塞信号集的关系 阻塞信号集是当前进程要阻塞的信号的集合 未决信号集是当前进程中还处于未决状态的信号的集合 这两个集合存储在内核的PCB中 下面以SIGINT为例说明信号未决信号集和阻塞信号集的关系 当进程收到一个SIGINT信
  • 《从零开始编写一个直播服务器》 C++ 实现一个最简单的RTSP流媒体服务器

    流媒体开发系列文章 文章目录 流媒体开发系列文章 前言 一 rtsp流是什么 二 使用步骤 1 服务器代码 总结 前言 在安防行业中 onvif协议与gb协议是两种标准 gb是国内安防行业的标准 onvif是国外的安防行业的标准 其中gb2
  • 【华为OD机试】数字游戏【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 小明玩一个游戏 系统发1 n张牌 每张牌上有一个整数 第一张给小明 后n张按照发牌顺序排成连续的一行 需要小明判断 后n张牌中 是否存在连续的若干张牌 其和可以整除小
  • Heroku 部署有关 opencv 的 Django 后端应用(pdf2docx)

    文章目录 场景 解决方案 Aptfile Buildpacks Dashboard 上手动构建 Heroku CLI 终端构建 Requirements txt 提交改变 场景 我使用 heroku 部署了一个 Django 后端项目 里面
  • C/C++内存布局

    下图是c c 的进程的内存分布布局图 搞清楚内存布局对于理解一个程序是非常重要的 一个程序运行起来 操作系统会给每个进程分配一个 4G 的程序地址空间 当然这都是虚拟地址空间 因为如果一个进程分 4G 的内存 那么就算有再多的内存也不够分
  • windows下的另一个辅助工具Devcon.exe(用会了绝对是神器)

    Device Console Help devcon exe r m
  • Unity3D关于iTween回调函数

    ITween一共三个回调函数 onstart onupdate和oncomplete 顾名思义可以从名字中看出来 常用到最后一个 要是我以后项目中用到了前两个函数 我会把例子添加上 关于oncomplete 就是在itween移动完成以后所
  • Spring Data Jpa

    spring data介绍 Spring Data s mission is to provide a familiar and consistent Spring based programming model for data acce
  • 单元测试、集成测试、系统测试

  • 串口通信——发送和接收数据(8位和16位数据之间的转换)

    1 实验目的 1 发送两个字节数据 就是16位的数据 每一次发送8位 发送两次 这里要进行数据的拆分 如发送一个0XFF56 接收得到的也是FF56 16进制显示 2 接收两个字节的数据 这里通过串口助手以16进制发送一个数据 将拼接的数据
  • winMain函数

    WinMain函数 int WINAPI WinMain HINSTANCE hInstance HINSTANCE hPrevInstance LPSTR lpCmdLine int nShowCmd 函数名 WinMain 返回值 in
  • QT界面工程导出成dll并在其他界面工程调用示例

    一 首先是生成dll 1 新建一个qt工程 2 在 pro文件做如下修改 TARGET qtdll TEMPLATE app DEFINES dllMainWindow LIBRARY TEMPLATE lib 其中qtdll 是自己dll
  • C#中Dictionary的用法总结

    可以实现通过键值查找 插入 删除一个键 值对的操作 这些如果用数组实现都非常麻烦 Key就是键 value就是值 我们在很多地方都会用到字典 他的特点就是查找很快 当然比List快 字典必须包含名空间System Collection Ge
  • pandas写入excel指定行_使用pandas操作excel

    pandas操作excel 最近由于要处理一些excel表格 发现pandas可以免去很多的繁琐的人工劳动 在这里记录一下我所用到的知识 导入文档 将excel中的工作表导入 filename xls data pd read excel
  • python中random.random()用法

    Python中的random模块用于生成随机数 下面介绍一下random模块中最常用的几个函数 random random random random 用于生成一个0到1的随机符点数 0 lt n lt 1 0 参考链接 https www
  • 拓扑布局和建立小型网络

    练习 2 6 1 拓扑布局和建立小型网络 地址表 本实验不包括地址表 拓扑图 学习目标 正确识别网络中使用的电缆 物理连接点对点交换网络 验证每个网络的基本连通性 简介 许多网络问题都可以在网络的物理层解决 因此 必须清楚了解网络连接使用哪
  • Android ffmpeg4.1 arm64位库裁剪

    ffmpeg4 1 Android arm64位库裁剪移植 目录 ffmpeg4 1 Android arm64位库裁剪移植 1 绪言 2 编译环境 3 源代码下载 4 编写编译脚本 4 1 编译脚本 4 2 常见问题 5 库裁剪 5 1