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.hqwc.cn/news/140057.html

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

相关文章

【网络爬虫】2 初探网络爬虫

爬虫练手 把豆瓣的书评list页爬取下来,并获取其书名,和detail的连接地址 豆瓣的书评list的url地址, start1,2,3,4…是其地址页 https://book.douban.com/top250?start1 f12 观察其html结构 思路 按照找到的list的页面地址: 1.获取list页…

Qt 窗口常用位置API函数 绘图原理 双缓冲机制 总结

一、Qt 窗口API函数基础知识 在Qt窗口编程中,常用的API函数有: QWidget类的API函数:包括setWindowTitle()、resize()、move()、show()、hide()、setFixedSize()、setWindowFlags()等。 QMainWindow类的API函数:包括setCentralWi…

网页构造与源代码

下载google浏览器 设置打开特定网址:www.baidu.com 查看网页或元素源代码 网页右键选择“检查”查看源代码 网页源代码 元素源代码

jmeter监听每秒点击数(Hits per Second)

jmeter监听每秒点击数(Hits per Second) 下载插件添加监听器执行压测,监听结果 下载插件 点击选项,点击Plugins Manager (has upgrades),点击Available Plugins,搜索5 Additional Graphs安装。 添加监听…

C#上位机序列9: 批量读写+事件广播

1. 读取配置文件及创建变量信息(点位名称,地址,数据类型(bool/short/int/float/long/double)) 2. 读任务&写任务,数据有变化时事件广播通知 using HslCommunication; using HslCommunication.Core; usi…

【Linux-常用命令-基础命令-删除文件夹以及内容-rm--r-命令-笔记】

【Linux-常用命令-基础命令-删除文件夹以及内容-rm--r-命令-笔记】 1、前言2、操作3、自己的操作 1、前言 最近,在使用Linux的时,使用相关基础命令是,总是容易忘记,上网一搜,大部分都写的比较繁琐,关于删除…

Datawhale学习笔记AI +新能源:电动汽车充电站充电量预测

赛题介绍 建立站点充电量预测模型,根据充电站的相关信息和历史电量数据,准确预测未来某段时间内充电站的充电量需求。 在赛题数据中,我们提供了电动汽车充电站的场站编号、位置信息、历史电量等基本信息。我们鼓励参赛选手在已有数据的基础上…

基于Scrapyd与Gerapy部署scrapy爬虫方案【可用于分布式爬虫部署】

scrapyd部署爬虫 Scrapyd 是一个基于 Scrapy 的开源项目,它提供了一个简单的方式来部署、运行和监控 Scrapy 爬虫。它是一个用于集成 Scrapy 爬虫到分布式架构中的工具,允许您在分布式环境中运行爬虫,并提供了一组 Web API,用于管…

信创办公–基于WPS的Word最佳实践系列 (图文环绕方式)

信创办公–基于WPS的Word最佳实践系列 (图文环绕方式) 目录 应用背景操作步骤1、 打开布局选项中图文环绕方式的方法2、 图文环绕三大类型 应用背景 在Word中,对文字和图片进行排版时,采用各种不同的图片与文字组合效果能够使页面…

Windows/Linux系统ftp服务器搭建

文章目录 一、Windows系统ftp服务器搭建二、Linux系统ftp服务器搭建二、安装完成测试 一、Windows系统ftp服务器搭建 系统是2008r2,全图,按照图一步一步点就行了 找个有telnet的电脑测试一下端口,windows的ftp默认端口是21 返回…

汽车屏类产品(二):360全景环视(SVC)、多分割显示、行车记录

前言 随着新能源汽车的快速发展,带动了车载器件的大发展,大的比如域控,小的创新更是不断涌现。而车载显示屏可以说是一大类产品,产品形态也是愈发多样化,比如:仪表cluster、中控IVI、副驾屏、行车记录仪、流媒体后视镜、透明A柱屏、方向盘屏(替代方向盘按键)、门饰板显…

性能测试:测试常见的指标(超详细~)

前言 今天想和大家来聊聊性能测试常见的指标,我在这里也不喜欢说废话我们直接开始吧。 同时,我也为大家准备了一份软件测试视频教程(含面试、接口、自动化、性能测试等),就在下方,需要的可以直接去观看&am…