ffmpeg+安卓+yolo+RK3399部署

一次满足多项需求.
首先, 思路是, 使用ffmpeg解码本地mp4文件, 在无需任何其他改动的情况下, 就可以直接播放rtsp流, 这个是使用ffmpeg的好处.
ffmpeg本身是c语言的, 所以需要编译成jni的库,
https://note.youdao.com/s/6XeYftc
具体过程在这里, 用windows/macOS, Ubuntu应该都是可以的, 因为NDK对应了所有的平台, 另外值得注意的是内置的交叉编译工具的平台, 最新的版本的NDK是没有交叉编译工具链的, 这里应该叫交叉链编译工具, 所以要下载21版本的NDK
编译好的ffmpeg lib, 有两部分, 头文件跟库文件, 库文件又分32位平台跟64位平台.
在这里插入图片描述
像这样整理好目录即可.
整个ffmpeg的文件夹, 放在带jni c++功能的安卓项目的cpp文件夹中, 这里记住, cpp文件夹就放c/cpp语言的jni代码, java目录就放java/kt代码.
接下来是rknn_api
历史经验告诉我, 如果rknn的应用库如果跟驱动版本差异大, 会有一些不知名的问题, 所以理论上需要让他们保持一致
在这里插入图片描述
上图中驱动版本偏低, 而且目前github上最新的版本是1.7.5
这个跟rknn的库必须配套, 好在rk在这方面做得还挺好, github更新挺及时的.
去rk3399pro对应的npu的github上, clone这个仓库下来.
https://github.com/airockchip/RK3399Pro_npu
它的README说得听清楚了, 如果需要升级, 就应该分清楚, 你的npu的平台是基于usb的架构,还是pcie, 我一开始还以为没可能不同代理商使用不同方案吧, 结果发现还真是.

那么如何查看当前板子是usb的, 还是pcie的呢?
在这里插入图片描述
就是无论是ubuntu系统, 还是安卓系统, 通过shell进去, 安卓就是adb 的shell, 然后运行npu_transfer_proxy devices
如果你是usb的npu, 可能会提示你没有npu, 这个时候别慌, 先点一根烟…
然后which命令, 找找npu_transfer_proxy这个命令是否存在,存在的话, 就用npu_transfer_proxy & 让它后台跑起来, 然后再使用npu_tranfser_proxy devices查看自己npu 的类型.
分清楚硬件上, npu是什么类型之后, 如果是usb, 对应的驱动仓库的文件夹就是npu_firmware/npu_fw, 如果是pcie, 就是npu_pcie_fw, 然后看板子上跑的是啥操作系统是ubuntu, 就在ubuntu上搜一下有没有boot.img这个文件, 一般在/usr/share/npu_fw或者/usr/share/npu_pcie_fw下面, 找到之后, 把仓库里面的5个文件都复制过去, 建议先把原来的备份一下, 这样万一出问题也可以后悔.

在这里插入图片描述

接下来, 尝试找到一个可执行程序, 叫做npu_upgrade, 理论上应该也在/usr/share/npu_fw目录下面, 然后手动更新一下npu:
sudo ./npu_upgrade MiniLoaderAll.bin uboot.img trust.img boot.img

过几秒钟, 就会提示你升级完成了. 这个时候驱动的部分就ok了, 安卓的做法也是一样, 只不过安卓的npu的路径在/vendor/etc/npu_fw 下面.

接下来回到安卓的项目目录, rknn_api稍微复杂一点, 因为分为安卓/Linux, 也有arm64-v8a跟armeabi-v7a的差别, 不过不用慌, 记住一点, 安卓/Linux好选, 3399pro是基于64位的架构, 所以都以arm64-v8a作为目标.
在安卓项目的cpp文件夹, 建一个目录叫libs, 然后分别把rknn_api的库复制进去, 我这里仅仅复制了arm64的库

rknn_api的头文件rknn_api.h就直接放在include目录即可.

在这里插入图片描述

 cmake_minimum_required(VERSION 3.22.1)
# cmake_minimum_required(VERSION 3.18.1)
# cmake_minimum_required(VERSION 3.6.4111459)project("myapplicationffmpegplayerkt")set(FFMPEG ${CMAKE_SOURCE_DIR}/ffmpeg)  # ffmpeg的路径
# set(RTMP ${CMAKE_SOURCE_DIR}/rtmp) # rtmp的路径
set(RKNN ${CMAKE_SOURCE_DIR}/rknn)include_directories(${RKNN}/include)  # 导入rknn的头文件
include_directories(${FFMPEG}/include)  # 导入ffmpeg的头文件# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${FFMPEG}/libs/${CMAKE_ANDROID_ARCH_ABI}")  # 导入ffmpeg的库文件
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${RTMP}/libs/${CMAKE_ANDROID_ARCH_ABI}") # rtmp库指定file(GLOB src_file *.cpp)   # 查找所有的cpp源文件, 相当于把所有的cpp都纳入编译add_library(native-lib   # 生成的so库的名字SHARED       # 动态库${src_file}) # 所有的cpp文件target_link_libraries(native-lib  # 生成的so库的名字${RKNN}/libs/${ANDROID_ABI}/librknn_api.so${FFMPEG}/libs/${ANDROID_ABI}/libavcodec.so${FFMPEG}/libs/${ANDROID_ABI}/libavdevice.so${FFMPEG}/libs/${ANDROID_ABI}/libavfilter.so${FFMPEG}/libs/${ANDROID_ABI}/libavutil.so${FFMPEG}/libs/${ANDROID_ABI}/libavformat.so${FFMPEG}/libs/${ANDROID_ABI}/libswresample.so${FFMPEG}/libs/${ANDROID_ABI}/libswscale.so# 引入的库不分先后# -Wl,--start-group# avcodec avfilter avformat avutil swresample swscale# -Wl,--end-grouplog # 引入log库z # 引入z库# rtmp # rtmp 后面会专门介绍 rtmp交叉编译+FFmpeg结合编译EGLGLESv2android # 引入android库OpenSLES # 引入OpenSLES库
)

CMakLists.txt长这样.
引入链接库的方法就是直接指向库文件就行.
安卓工程中, 唯一值得一提的就是修改app下面的build.gradle了.

在这里插入图片描述

这里要使用arm64-v8a提示ndk的交叉编译器编译出来的jni库, 只需要arm64的, 因为3399是arm64平台, 理论上我 猜测, 因为安卓我确实不熟, 我猜测, 也可以用add语法, 加入其他平台的, 编译的时候会一起打包到apk文件中, 到时候应用层也好, 系统层也好, 能跟据自己的系统类型, 来选择对应的库.
接着通过jni运行rknn的例程, 就会发现, 驱动层跟应用层都已经升级到了1.7.5:
在这里插入图片描述
下面的示例代码是用一张原始640x640图片做的输入, ffmpeg融入的部分参考我github里面的ktplayer, 因为涉及商用利益冲突, 就不放完整的代码了.

https://github.com/MontaukLaw/rknn_android_3399_pro

承接各类部署工程, 目前熟悉的平台有, RK1106, 1126, 3588, 3399pro, 3568, 海思3516DV300(仅限推拉流), 有兴趣各位客官老爷们站内信.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/162624.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AWD学习总结 (会持续更新)

防御 一、登录ssh服务器 所有人都要登上去。这里以我自己的服务器为例子。一般使用默认的ssh登录方式,我个人服务器ip是120.46.41.173使用工具是xshell与xftp。 点击新建连接。 输入ip。默认ssh端口22不用改就能连接。 然后点击侧边栏,输入账号密码登…

一步一步分析ChatGPT,1 粘性,2 传染性, 3 双边网络效应

请按照以下三个维度一步一步分析ChatGPT,1 粘性,2 传染性, 3 双边网络效应,比如亚马逊的买家和商家的关系 ChatGPT的分析 1.1. 粘性 (Stickiness) 定义: 粘性是指产品或服务对用户的吸引力,即用户在使用…

uniapp-vue3-微信小程序-按钮组wo-btn-group

采用uniapp-vue3实现, 是一款支持高度自定义的按钮组组件&#xff0c;支持H5、微信小程序&#xff08;其他小程序未测试过&#xff0c;可自行尝试&#xff09; 可到插件市场下载尝试&#xff1a; https://ext.dcloud.net.cn/plugin?id15012 使用示例 <template><vie…

CCF CSP认证 历年题目自练Day35

题目一 试题编号&#xff1a; 202305-1 试题名称&#xff1a; 重复局面 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 问题描述&#xff1a; 题目背景 国际象棋在对局时&#xff0c;同一局面连续或间断出现3次或3次以上&#xff0c;可由任意一方提出和棋。 问题…

GEO生信数据挖掘(八)富集分析(GO 、KEGG、 GSEA 打包带走)

第六节&#xff0c;我们使用结核病基因数据&#xff0c;做了一个数据预处理的实操案例。例子中结核类型&#xff0c;包括结核&#xff0c;潜隐进展&#xff0c;对照和潜隐&#xff0c;四个类别。第七节延续上个数据&#xff0c;进行了差异分析。 本节对差异基因进行富集分析。 …

MySQL 8.0 OCP认证精讲视频、环境和题库之五 事务、缓存

redo log buffer&#xff1a; 缓存与事务有关的redo log ,用来对mysql进行crash恢复&#xff0c;不可禁用&#xff1b; 日志缓冲区是存储要写入磁盘上日志文件的数据的内存区域。日志缓冲区大小由innodb_Log_buffer_size变量定义。 默认大小为16MB。日志缓冲区的内容会定…

视频标注是什么?和图像数据标注的区别?

视频数据标注是对视频剪辑进行标注的过程。进行标注后的视频数据将作为训练数据集用于训练深度学习和机器学习模型。这些预先训练的神经网络之后会被用于计算机视觉领域。 自动化视频标注对训练AI模型有哪些优势 与图像数据标注类似&#xff0c;视频标注是教计算机识别对象…

Unity之ShaderGraph如何实现卡通效果

前言 今天我们来实现一下最常见的卡通效果。 效果如下&#xff1a; 关键节点 Remap&#xff1a;基于输入 In 值在输入In Min Max的 x 和 y 分量之间的线性插值&#xff0c;返回输入Out Min Max的 x 和 y 分量之间的值。 SampleGradient&#xff1a;在给定Time输入的情况下…

【网络协议】聊聊DHCP和PXE 工作原理

DHCP 动态主机配置协议 对于每个主机来说&#xff0c;只要连接了网络&#xff0c;那么就会配置一个IP地址&#xff0c;那么这个IP地址&#xff0c;如果是手动配置的话&#xff0c;对于公司内部的人员来说都要找IT进行配置&#xff0c;这个太浪费人力物力了&#xff0c;所以解决…

.NET验收

验收通用模板&#xff1a; 1.该资料计划看几天&#xff1f; 实际看了几天&#xff1f; 计划7天&#xff0c;实际看了9天 2.多少天一篇总结&#xff1f;将总结列出来。 一周总结一篇。 博客地址:3.这个资料相较于之前资料共同的内容是什么&#xff1f; 不同的(需要强化学习)…

macOS Sonoma 14.1RC(23B73)发布

黑果魏叔10 月 18 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 14.1 RC更新&#xff08;内部版本号&#xff1a;23B73&#xff09;&#xff0c;本次更新距离上次发布隔了 7 天。 macOS Sonoma 14.1RC&#xff08;23B73&#xff09;的更新内容主要包括以下方面&…

轻重链剖分+启发式合并专题

Codeforces-741D(Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths) 一棵根为1 的树&#xff0c;每条边上有一个字符&#xff08;a-v共22种&#xff09;。 一条简单路径被称为Dokhtar-kosh当且仅当路径上的字符经过重新排序后可以变成一个回文串。 求每个子树中…

0基础学习PyFlink——Map和Reduce函数处理单词统计

在很多讲解大数据的案例中&#xff0c;往往都会以一个单词统计例子来抛砖引玉。本文也不免俗&#xff0c;例子来源于PyFlink的《Table API Tutorial》&#xff0c;我们会通过几种方式统计不同的单词出现的个数&#xff0c;从而达到循序渐进的学习效果。 常规方法 # input.py …

Python configparser模块使用教程

文章目录 .ini 拓展名文件简介.ini 文件格式1. 节2. 参数3. 注解 configparser 模块简介configparser 模块的初始化和读取获取 ini 中所有 section获取 section 下的 key获取 section 下的 value获取指点section的所用配置信息修改某个key&#xff0c;如果不存在则会出创建检查…

中文编程开发语言工具编程案例:计时计费管理系统软件连接灯控器编程案例

中文编程开发语言工具编程案例&#xff1a;计时计费管理系统软件连接灯控器编程案例 中文编程开发语言工具编程案例&#xff1a;计时计费管理系统软件连接灯控器编程案例 中文编程系统化教程&#xff0c;不需英语基础。学习链接 https://edu.csdn.net/course/detail/39036

Unity之ShaderGraph如何实现积雪效果

前言 我们在一些特殊场景&#xff0c;比如冰雪天&#xff0c;经常会对周围物体添加一些积雪效果&#xff0c;如果我们直接把积雪做到模型上&#xff0c;就无法更加灵活的表现其他天气的环境了&#xff0c;比如春夏秋冬切换。所以一般这种需求我们都是使用Shader来表现。 入下图…

java学生通讯录管理系统

设计要求 本课程设计&#xff0c;涉及输入输出、GUI设计、数据库操作等本课程重要概念和编程技能&#xff0c;全面巩固和加深学生对java程序设计的相关概念的理解&#xff0c;全面强化java编程技能&#xff0c;培养学生综合运用所学知识和技能分析问题和解决问题的能力。培养学…

Windows运维相关经验技巧

常用工具 在线PS Photoshop在线 FAQ 电脑能上网&#xff0c;浏览器上不了网 # 错误原因&#xff1a; 设置了网络代理&#xff0c;浏览器无法通过网络代理上网# 解决办法 关闭网络代理 &#xff08;1&#xff09;wini&#xff0c;打开设置 &#xff08;2&#xff09;网络和I…

【YOLO】拾遗(五)

0 YOLO系列笔记 【YOLO】朴实无华的yolov5环境配置&#xff08;一&#xff09; 【YOLO】yolov5训练自己的数据集&#xff08;二&#xff09; 【YOLO】目标识别模型的导出和opencv部署&#xff08;三&#xff09; 【YOLO】语义分割和实例分割&#xff08;四&#xff09; 1 …

R语言进度条:txtProgressBar功能使用方法

R语言进度条使用攻略 在数据处理、建模或其他计算密集型任务中&#xff0c;我们常常会执行一些可能需要很长时间的操作。 在这些情况下&#xff0c;展示一个进度条可以帮助我们了解当前任务的进度&#xff0c;以及大约还需要多长时间来完成&#xff0c;R语言提供了几种简单且灵…