当前位置: 首页 > news >正文

[嵌入式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-cflagsextra-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_ascendh265_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

结果如下

编解码器用时
h2643分39秒
h264_ascend1分39秒
h26540分49秒
h265_ascend1分39秒

实测在h265编码环节,ascend硬件编解码有大约25倍的提升。
注意:这个数据还不是ascend硬件编解码器的极限,全程平均cpu在60%左右,而libx264或libx265几乎跑满了cpu。

六、问题

1、安装x265时找不到numa

这里有两种方案

  1. 检查x265_3.3/source/cmake/FindNuma.cmake这个文件中的NUMA是否被全部替换为了Numa,至少我上文提到的几行必须更改
  2. 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. 移动零&#xff0…...

【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日志&#xff…...

13 list的实现

注意 实现仿cplus官网的list类&#xff0c;对部分主要功能实现 实现 文件 #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中&#xff0c;你可以使用client-go库来获取Pod的状态和事件&#xff0c;这些信息可能包含了由于资源不足引起的错误信息。 以下是一个基本的示例&#xff0c;展示如何使用client-go来获取Pod的状态和事件&#xff1a; package mainimport ("flag"&quo…...

IDEA编译安卓源码TVBox(2)

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

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...