[嵌入式AI从0开始到入土]16_ffmpeg_ascend编译安装及性能测试
[嵌入式AI从0开始到入土]嵌入式AI系列教程
注:等我摸完鱼再把链接补上
可以关注我的B站号工具人呵呵的个人空间,后期会考虑出视频教程,务必催更,以防我变身鸽王。
第1期 昇腾Altas 200 DK上手
第2期 下载昇腾案例并运行
第3期 官方模型适配工具使用
第4期 炼丹炉的搭建(基于Ubuntu23.04 Desktop)
第5期 炼丹炉的搭建(基于wsl2_Ubuntu22.04)
第6期 Ubuntu远程桌面配置
第7期 下载yolo源码及样例运行验证
第8期 在线Gpu环境训练(基于启智ai协作平台)
第9期 转化为昇腾支持的om离线模型
第10期 jupyter lab的使用
第11期 yolov5在昇腾上推理
第12期 yolov5在昇腾上应用
第13期_orangepi aipro开箱测评
第14期 orangepi_aipro小修补含yolov7多线程案例
第15期 orangepi_aipro欢迎界面、ATC bug修复、镜像导出备份
第16期 ffmpeg_ascend编译安装及性能测试
未完待续…
文章目录
- [嵌入式AI从0开始到入土]嵌入式AI系列教程
- 前言
- 一、卸载ffmpeg
- 二、前置依赖安装
- 1、libx264编码器
- 2、libx265编码器
- 3、fdk-aac
- 4、lame
- 5、speex
- 三、获取源码
- 四、编译安装
- 1、添加环境变量
- 2、编译配置
- 3、编译安装
- 4、验证编码器是否可用
- 五、性能测试
- 六、问题
- 1、安装x265时找不到numa
- 2、找不到ascend相关的编码器
- 3、fftools/ffmpeg_opt.c:23:10: fatal error: csignal: No such file or directory
- 4、xxx.so no found
- 1、添加环境变量
- 2、配置动态链接库
- 总结
前言
注:本文基于香橙派24.02.27日ubuntu_desktop镜像
镜像预装的ffmpeg是4.5.4版本,h265解码1080*1080的mp4视频帧数低至0.8帧。几乎处于不可用的状态。启用h265_ascend编解码器后,能够凭借libx265编解码器不到一半的cpu利用率实现超过20帧的成绩。
镜像预装ffmpeg情况如下,但是没有h265编码器。
本文测试视频信息如下,统一不处理音频数据。
ffmpeg -i test.mp4 -s 1920*1080 -c:v libx264 -an out.264
用时3分38秒
,cpu利用率几乎全程100%
一、卸载ffmpeg
sudo apt --purge remove ffmpeg
ffmpeg -version #如下图所示即为卸载成功
二、前置依赖安装
libx264和libx265可以不安装,这里是为了对性能做对比。
1、libx264编码器
没什么好说的,照抄
wget https://code.videolan.org/videolan/x264/-/archive/master/x264-master.tar.bz2
tar jxf x264-master.tar.bz2
cd x264-master
./configure --prefix=/usr --enable-shared --disable-asm
make -j4
sudo make install
x264
出现如下提示表示安装成功
2、libx265编码器
这里我使用的是最新的版本,但是需要修改几个地方,否则配置的时候就会报错。
wget https://www.x265.org/files/x265_v3_3.tar.gz
tar -xf x265_3.3.tar.gz
cd x265_3.3/build/linux
这里需要修改几个地方,否则配置的时候就会报错。
vim ../../source/CMakeLists.txt
#43行添加aarch64
set(ARM_ALIASES armv6l armv7l aarch64)
67-75行这里替换整段
elseif(ARMMATCH GREATER "-1")if("${SYSPROC}" STREQUAL "aarch64")message(STATUS "Detected aarch64 target processor")set(AARCH64 1)add_definitions(-DX265_ARCH_AARCH64=1)else()if(CROSS_COMPILE_ARM)message(STATUS "Cross compiling for ARM arch")else()set(CROSS_COMPILE_ARM 0)endif()message(STATUS "Detected ARM target processor")set(ARM 1)add_definitions(-DX265_ARCH_ARM=1 -DHAVE_ARMV6=1)endif()
接着安装两个包
sudo apt-get install libnuma-dev
sudo apt-get install nasm
接着是是两个包名的问题
vim ../../source/cmake/FindNasm.cmake
#23行
find_package_handle_standard_args(Nasm
vim ../../source/cmake/FindNuma.cmake
将21,26,32,37,41,43行的NUMA
改为Numa
,修改后如图所示。
再安装一个包,不然不会出现配置界面
sudo apt-get install cmake-curses-gui
./make-Makefiles.bash
如果上面配置正确,会弹出如下配置界面,请参考下图配置,OFF
的选项看需求开启,ON
的不要动,会导致编译失败。
这里使用方向键移动,空格开启/关闭选项,修改完成后,按c配置,确认输出信息如下
此处如果出现libnuma找不到的情况,看问题区第一条。
按e,g完成配置。
配置完成后,编译安装
make -j4
sudo make install
x265 #验证安装
3、fdk-aac
fdk-aac 是一个高效、高质量的开源音频编解码器,它实现了 MPEG 高级音频编解码器(AAC)的标准。
wget https://jaist.dl.sourceforge.net/project/opencore-amr/fdk-aac/fdk-aac-2.0.3.tar.gz
tar -zxf fdk-aac-2.0.3.tar.gz
cd fdk-aac-2.0.3
sudo apt-get install autoconf
sudo apt-get install libtool
./autogen.sh
./configure --enable-shared CFLAGS=-fPIC
配置成功,你将看到如下提示信息
make -j4
sudo make install
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/ #建议加到.bashrc里
4、lame
LAME 是一个开源的 MP3 编码器,它的名字最初是作为“LAME Ain’t an MP3 Encoder”的递归缩写。尽管名字中暗示它不是一个 MP3 编码器,但实际上 LAME 是一个非常流行和广泛使用的 MP3 编码库和程序。它允许用户将音频文件转换为 MP3 格式,并提供广泛的编码选项来调整压缩效率和音频质量。
wget https://zenlayer.dl.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz
tar -zxf lame-3.100.tar.gz
cd lame-3.100
./configure --enable-shared
make -j4
sudo make install
5、speex
Speex 是一个开源的音频编解码器,专门设计用于处理语音信号。Speex 非常适合实时通信应用,如VoIP和视频会议系统,因为它可以处理非常短的音频帧,减少传输延迟,Speex 包括噪声抑制、回声消除和增益控制等语音增强功能。
wget https://ftp.osuosl.org/pub/xiph/releases/speex/speex-1.2.1.tar.gz
tar -zxf speex-1.2.1.tar.gz
cd speex-1.2.1
./configure
make -j4
sudo make install
三、获取源码
这里使用的是昇腾的官方仓库,除了版本有点老,是4.4.1,现在都6.1了。后期我试试移植过去。
git clone https://gitee.com/ascend/mindxsdk-referenceapps.git
四、编译安装
ASCEND_HOME_PATH
这个是cann自带的,指向/usr/local/Ascend/ascend-toolkit/latest
。
1、添加环境变量
这一步能有效解决下面extra-cflags
和extra-ldflags
报错的问题。
source /usr/local/Ascend/ascend-toolkit/set_env.sh
export LD_LIBRARY_PATH=/usr/lib:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:$LD_LIBRARY_PATH
2、编译配置
cd mindxsdk-referenceapps/mxVision/Ascendffmpeg
chmod +x ./configure
chmod +x ./ffbuild/*.sh
#除前5个配置外,其余看需求设置
./configure \--prefix=/usr \--enable-shared \--extra-cflags="-I${ASCEND_HOME_PATH}/acllib/include" \--extra-ldflags="-L${ASCEND_HOME_PATH}/aarch64-linux/lib64" \--extra-libs="-lacl_dvpp_mpi -lascendcl" \--enable-ascend \--enable-gpl \--enable-nonfree \--enable-ffplay \--enable-libfdk-aac \--enable-libmp3lame \--enable-libx264 \--enable-libx265 \--enable-filter=delogo \--enable-debug \--disable-optimizations \--enable-libspeex \--enable-shared \--enable-pthreads \--enable-version3
从这开始就是噩梦,你会发现日志中h264_ascend
和h265_ascend
这俩编解码器都是enable,enable hwaccels
中也有h264_ascend
。但是编译后就是没有的情况,或者就是存在,但是疯狂报错。解决办法看问题区第2条。
3、编译安装
make -j$(nproc)
不出意外的话又要出意外了
直接看问题区第3点
sudo make install
到这里安装算完成了,但很可能会有类似找不到libfdk-aac.so.2
等的报错,看问题区第4点。
4、验证编码器是否可用
ffmpeg -encoders | grep ascend
ffmpeg -decoders | grep ascend
ffmpeg -hwaccels | grep ascend
确认出现图中的ascend编码器
五、性能测试
依旧是我们开头的test.mp4视频。
#h264编解码测试
ffmpeg -i test.mp4 -s 1920*1080 -c:v libx264 -an out1.264
ffmpeg -hwaccel ascend -i test.mp4 -s 1920*1080 -c:v h264_ascend -an out_ascend.264#h265编解码测试
ffmpeg -i test.mp4 -s 1920*1080 -c:v libx265 -an out.265
ffmpeg -hwaccel ascend -i test.mp4 -s 1920*1080 -c:v h265_ascend -an out_ascend.265
结果如下
编解码器 | 用时 |
---|---|
h264 | 3分39秒 |
h264_ascend | 1分39秒 |
h265 | 40分49秒 |
h265_ascend | 1分39秒 |
实测在h265编码环节,ascend硬件编解码有大约25倍的提升。
注意:这个数据还不是ascend硬件编解码器的极限,全程平均cpu在60%左右,而libx264或libx265几乎跑满了cpu。
六、问题
1、安装x265时找不到numa
这里有两种方案
- 检查
x265_3.3/source/cmake/FindNuma.cmake
这个文件中的NUMA
是否被全部替换为了Numa
,至少我上文提到的几行必须更改 - 在
x265_3.3/build/linux
目录下执行以下命令,指定Numa路径。
cmake -D Numa_INCLUDE_DIR=/usr/include/libnuma -D Numa_LIBRARY=/usr/lib/libnuma.so -D Numa_ROOT_DIR=/usr .
2、找不到ascend相关的编码器
这里我也是查了很久,甚至看了N长的编译日志(日志中没有出现ascend相关的信息),最后发现需要在./configure之前添加以下环境变量
export LD_LIBRARY_PATH=${ASCEND_HOME_PATH}/acllib/lib64/:$LD_LIBRARY_PATH #建议使用下面的绝对路径
export LD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64/:$LD_LIBRARY_PATH
3、fftools/ffmpeg_opt.c:23:10: fatal error: csignal: No such file or directory
将这两个文件的报错的地方的csignal
改为signal.h
sudo apt-get install build-essential
vim fftools/ffmpeg_opt.c
vim fftools/ffmpeg.c
4、xxx.so no found
这里以libfdk-aac.so.2
为例
find / -name 'libfdk-aac.so.2'
我们查到这个文件在/usr/local/lib
目录,接着就有两种方案了,推荐第二种,这样所有用户都可以使用。
1、添加环境变量
export LD_LIBRARY_PATH=/usr/lib/:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
2、配置动态链接库
sudo vim /etc/ld.so.conf
#将我们搜索到的路径加入其中
sudo ldconfig
总结
以上就是ffmpeg启用ascend硬件编辑器的相关过程,当然,要想压榨极限性能,建议使用DVPP,不过就是没有这么方便罢了。
相关文章:

[嵌入式AI从0开始到入土]16_ffmpeg_ascend编译安装及性能测试
[嵌入式AI从0开始到入土]嵌入式AI系列教程 注:等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间,后期会考虑出视频教程,务必催更,以防我变身鸽王。 第1期 昇腾Altas 200 DK上手 第2期 下载昇腾案例并运行 第3期 官…...

HTML5:七天学会基础动画网页11
CSS3动画 CSS3过渡的基本用法: CSS3过渡是元素从一种样式逐渐改变为另一种样式的效果。 过渡属性-transition 值与说明 transition-property 必需,指定CSS属性的name,transition效果即哪个属性发生过渡。 transition-duration 必需,t…...

考虑开发容器的 6 个理由
虽然在容器环境内进行开发的行为可以追溯到 2010 年代中期,但开发容器本身在过去一年中已经开始流行。微软在 2022 年推出了开发容器规范,推动了这一概念的发展,而 Docker 在去年夏天也紧随其后,推出了开发环境功能的测试版。 开…...

Python基础入门 --- 1-2.字面量
文章目录 Python基础入门第一章:1.1 第一个python程序 第二章 :2.1 字面量2.2 常用的值类型2.3 字符串2.3.1 三种定义方式2.3.2 引号嵌套2.3.3 字符串拼接2.3.4 字符串格式化2.3.5 格式化的精度控制数字精度控制: 2.3.6 字符串格式化方式22.3…...

华为云计算hcie认证考什么?华为hciie认证好考吗
1.理论知识:HCIE认证首先要求考生具备扎实的云计算理论基础,包括云计算的基本概念、架构、关键技术、安全管理等方面的知识。考生需要深入理解云计算的核心原理,以及华为云计算产品的特点和优势。 2.实践技能:除了理论知识外&…...

redis spring cache
数据库的数据是存储在硬盘上的,频繁访问性能较低。如果将一些需要频繁查询的热数据放到内存的缓存中,可以大大减轻数据库的访问压力。 SpringCache SpringCache提供基本的Cache抽象,并没有具体的缓存能力,需要配合具体的缓存实现…...

图解I/O中的零拷贝技术
什么是零拷贝? 零拷贝是一种计算机系统中的 I/O 优化技术,它的核心思想是在数据传输过程中尽可能地减少或完全避免 CPU 将数据从一个存储区域复制到另一个存储区域的操作,从而减少了上下文切换和 CPU 拷贝时间,提高了系统的性能和…...

【设计模式】Java 设计模式之桥接模式(Bridge)
桥接模式(Bridge Pattern)是结构型设计模式的一种,它主要解决的是抽象部分与实现部分的解耦问题,使得两者可以独立变化。这种类型的设计模式属于结构型模式,因为该模式涉及如何组合接口和它们的实现。将抽象部分与实现…...

记录dockers中Ubuntu安装python3.11
参考: docker-ubuntu 安装python3.8,pip3_dockerfile ubuntu22 python3.8-CSDN博客...

【算法专题--双指针算法】leetcode--283. 移动零、leetcode--1089. 复写零
🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 前言1. 移动零࿰…...

【JavaEE -- 多线程3 - 多线程案例】
多线程案例 1.单例模式1.1 饿汉模式的实现方法1.2 懒汉模式的实现方法 2. 阻塞队列2.1 引入生产消费者模型的意义:2.2 阻塞队列put方法和take方法2.3 实现阻塞队列--重点 3.定时器3.1 定时器的使用3.2 实现定时器 4 线程池4.1 线程池的使用4.2 实现一个简单的线程池…...

k8s的pod服务升级,通过部署helm升级
要通过Helm升级Kubernetes(k8s)中的Pod服务,你可以按照以下步骤进行操作: 安装Helm: 如果你还没有安装Helm,可以通过官方文档提供的方式进行安装。添加Helm仓库: 确保你已经添加了包含你要升级…...

复现文件上传漏洞
一、搭建upload-labs环境 将下载好的upload-labs的压缩包,将此压缩包解压到WWW中,并将名称修改为upload,同时也要在upload文件中建立一个upload的文件。 然后在浏览器网址栏输入:127.0.0.1/upload进入靶场。 第一关 选择上传文件…...

Java 内存异常
内存溢出 内存溢出指的是在程序执行过程中,申请的内存超过了系统实际可用的内存资源。 内存溢出的常见情况: 创建大量对象并持有引用:在程序中创建大量对象并持有对这些对象的引用,而没有及时释放这些引用,导致堆内存…...

Windows11去掉 右键菜单的 AMD Software:Adrenalin Edition 选项
Windows11去掉 右键菜单的 AMD Software:Adrenalin Edition 选项 运行regedit打开注册表编辑器 先定位到 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PackagedCom\Package 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PackagedCom\Package找到 AdvancedMicroDevicesInc-2.…...

uniapp实现我的订单页面无感 - 删除数据
在进入我们的订单页面时进行获取列表,上拉加载,下拉刷新等请求,我们在删除数据时,请求删除接口后,不要重新去请求数据,不要重新去请求数据,不要重新去请求数据 重新请求会刷新页面中的数据 方…...

MySQL—redo log、undo log以及MVCC
MySQL—redo log、undo log以及MVCC 首先回忆一下MySQL事务的四大特性:ACID,即原子性、一致性、隔离性和持久性。其中原子性、一致性、持久性实际上是由InnoDB中的两份日志保证的,一份是redo log日志,一份是undo log日志ÿ…...

13 list的实现
注意 实现仿cplus官网的list类,对部分主要功能实现 实现 文件 #pragma once #include <assert.h>namespace mylist {template <typename T>struct __list_node{__list_node(const T& x T()): _prev(nullptr), _next(nullptr), _data(x){}__lis…...

如何用client-go获取k8s因硬盘容量、cpu、内存、gpu资源不够引起的错误信息?
在Kubernetes中,你可以使用client-go库来获取Pod的状态和事件,这些信息可能包含了由于资源不足引起的错误信息。 以下是一个基本的示例,展示如何使用client-go来获取Pod的状态和事件: package mainimport ("flag"&quo…...

IDEA编译安卓源码TVBox(2)
一、项目结构:主要app和player app结构 二、增加遥控器按键选台 修改LivePlayActivity.java 1、声明变量 public String channelId "";public Timer timer new Timer();public Toast mToast;2、定义方法 private void mToastShow(String s){mToast …...

【C#】.net core 6.0 使用第三方日志插件Log4net,配置文件详细说明
欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。…...

第十四届蓝桥杯省赛真题 Java 研究生 组【原卷】
文章目录 发现宝藏【考生须知】试题 A: 特殊日期试题 B: 与或异或试题 C: 棋盘试题 D: 子矩阵试题 E : \mathrm{E}: E: 互质数的个数试题 F: 小蓝的旅行计划试题 G: 奇怪的数试题 H: 太阳试题 I: 高塔试题 J \mathrm{J} J : 反异或 01 串 发现宝藏 前些天发现了一个巨牛的人…...

adb shell input text 输入中文
由于adb 不支持中文输入(不支持 Unicode),需要使用虚拟键盘绕一圈。 可以直接参考和使用: https://github.com/senzhk/ADBKeyBoard # 通用方式 adb shell am broadcast -a ADB_INPUT_TEXT --es msg 赞 # mac/linux 支持 base64…...

Rudolf and the Ball Game
传送门 题意 思路 暴力枚举每一个妆台的转换条件 code #include<iostream> #include<cstdio> #include<stack> #include<vector> #include<algorithm> #include<cmath> #include<queue> #include<cstring> #include<ma…...

计算机毕业设计-基于大数据技术下的高校舆情监测与分析
收藏和点赞,您的关注是我创作的动力 文章目录 概要 一、研究背景与意义1.1背景与意义1.2 研究内容 二、舆情监测与分析的关键技术2.1 robot协议对本设计的影响2.2 爬虫2.2.1 工作原理2.2.2 工作流程2.2.3 抓取策略2.3 scrapy架构2.3.1 scrapy:开源爬虫架…...

WPF使用LiveCharts画图时,横坐标转换成时间
一、背景 使用LiveCharts画图时,横坐标通常为数值类型,要转换成时间等自定义类型,需要用到Formatter进行类型转换。 示例使用MVVM模式编写 二、View代码 关键是设置LabelFormatter属性 <lvc:CartesianChart Series"{Binding Series…...

Qt客户端开发的技术难点
在Qt客户端开发中,可能会遇到一些技术难点,这些难点可能与UI设计、性能优化、跨平台兼容性等方面有关。以下是一些可能的技术难点,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作…...

杰理AD155儿童玩具语音集成电路
一、杰理AD155集成电路是由杰理科技设计、开发和销售的一款产品,AD15系列 SoC 芯片支持以下特性: 工作电压:2.0V-5.5V主频可达120MHz的32bitCPU,片上集成20K字节SRAM,8K字节ICache支持最多2路解码同时运行,支持F1A/A/…...

git bash 命令行反应慢、卡顿(定位出根本原因)
参考该博主: https://blog.csdn.net/weixin_50212044/article/details/131575987?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-131575987-blog-130024908.235v43pc_blog_bottom_relevance_base4&spm1001.210…...

Android 启动service(Kotlin)
一、使用startForegroundService()或startService()启用service **Activity //启动service val intent: Intent Intent(ServiceActivitythis,MyService::class.java) //Build.VERSION_CODES.O 26 // Android8以后,不允许后台启动Service i…...