ffmpeg+安卓+yolo+RK3399部署

news2025/1/25 4:36:13

一次满足多项需求.
首先, 思路是, 使用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-group

        log # 引入log库
        z # 引入z库
        # rtmp # rtmp 后面会专门介绍 rtmp交叉编译+FFmpeg结合编译

        EGL
        GLESv2
        android # 引入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.coloradmin.cn/o/1094431.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 字典

目录 1 字典介绍2 字典的创建3 字典元素的访问4 字典元素添加、修改、删除5 序列解包6 表格数据使用字典和列表存储,并实现访问7 字典核心底层原理(重要)7.1 将一个键值对放进字典的底层过程7.2 扩容7.3 根据键查找“键值对”的底层过程7.4 用法总结: 声…

【多媒体技术与实践】使用OpenCV处理图像(实验三.上)

1:图像直方图 将原彩色图像转成灰度图像,得到该灰度图像的灰度直方图,并对灰度直方图进行直方图均衡化,将原图、灰度图、直方图及均衡化后的直方图一起拼接为一张图片 import cv2 import numpy as np import matplotlib.pyp…

数据结构与算法 | 第一章:概论

本文参考网课为 数据结构与算法 1 第一章概论,主讲人 张铭 、王腾蛟 、赵海燕 、宋国杰 、邹磊 、黄群。 本文使用IDE为 Clion,开发环境 C14。 更新:2023 / 10 / 15 数据结构与算法 | 第一章:概论 数据结构概念逻辑存储运算抽象…

Java基础--阳光总在风雨后,请相信彩虹

1、今日任务 JAVA SE-韩顺平视频教程–30p以上(今天得50p以上因为是基础)计算机基础八股记忆总结刷题(两题)可以先用python 1、SSM ssm->Spring(轻量级的文本开发框架)/SpringMVC(分层的w…

【string题解 C++】翻转字符串II:区间部分翻转 | 验证回文串

翻转字符串II:区间部分翻转 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 难度:简单 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个…

【Mybatis】基于TypeHandler实现敏感数据加密

一、介绍 业务场景中经常会遇到诸如用户手机号,身份证号,银行卡号,邮箱,地址,密码等等信息,属于敏感信息,需要保存在数据库中。而很多公司会会要求对数据库中的此类数据进行加密存储。 敏感数据…

【JY】求?减隔震元件的滞回面积~

写在前文 为了求解等效阻尼比,通常我们需要求解滞回圈的面积,由于形状不是常见规整可直接套用长乘宽的形状,因此大多数人经常无从下手,或者分割分割再分割,一顿操作猛如虎,然后再得出结果。 计算方法 不论是…

私仓库Nexus

私仓库Nexus搭建 没有命令提示符tab键无效 #安装Linux命令补全工具 yum -y install bash-completion #执行bash或者reboot重启系统 bash#如果上述的命令执行了有问题可以执行功能下面的命令 yum install epel-release -y yum install bash-completion bash-completion-extras…

[资源推荐]langchain、LLM相关

之前很多次逛github或者去B站看东西或者说各种浏览资讯的情况,都会先看两眼然后收藏然后就吃灰的情况,那既然这样,不如多看几眼,看看是否真的能用得上,能用在哪,然后用几句话总结出来,分享出来&…

rsync 备份工具(附rsync+inotify 实时同步部署实例)

rsync 备份工具(附rsyncinotify 实时同步部署实例) 1、rsync概述1.1关于rsync1.2rsync 的特点1.3工作原理 2、rsync相关命令2.1基本格式和常用选项2.2启动和关闭rsync服务2.3下行同步基本格式2.4上行同步基本格式2.5免交互2.5.1指定密码文件2.5.2rsync-daemon方式2.…

推荐《Blue prison》

电视动画片《蓝色监狱》改编自金城宗幸原作、野村优介作画的同名漫画作品,于2021年7月31日宣布电视动画化的消息 [1]。该片由8Bit负责动画制作,于2022年10月9日起播出 [2],全24集。 该作评为Anime Corner 2022年年度体育动画 [24]&#xff0…

【MongoDB】MongoDB 的介绍和使用

1. 关系型与非关系型数据库 关系型数据库(RDBMS)和非关系型数据库(NoSQL)是两种不同类型的数据库管理系统。 关系型数据库是基于关系模型的数据库。它使用表(关系)来保存数据,并且通过事先定义…

雷电模拟器上使用第一个frida(一)之安装

环境:win10 64,雷电模拟器9.0.60(9),Android 9,本机Python 3.10.4,路径: python3路径 cd C:\Users\LC\AppData\Local\Programs\Python\Python310pip3路径 cd C:\Users\LC\AppData\Local\Programs\Python\P…

草莓病害图像数据集(YOLO使用,train为655张照片和val为487张照片)

前言:所有图像和标签是一一对应,没有标签缺失 写了两个程序来分别检查train文件夹的图像和val文件夹图像是否有缺失标签,如果有,会直接打印出缺失标签的图像名字。也方便以后用户自己添加自己收集的图像数据后,核对图…

NNDL:作业3:分别使用numpy和pytorch实现FNN例题

对比【numpy】和【pytorch】程序,总结并陈述。 激活函数Sigmoid用PyTorch自带函数torch.sigmoid(),观察、总结并陈述。 激活函数Sigmoid改变为Relu,观察、总结并陈述。 损失函数MSE用PyTorch自带函数 t.nn.MSELoss()替代,观察、总…

软件工程与计算总结(十二)详细设计的基础

目录 一.详细设计概述 1.出发点 2.上下文 二.结构化设计 1.思想 2.过程 三.面向对象设计 1.思想 2.过程 3.通过职责建立静态模型 4.通过协作建立动态模型 四.为类间协作开发集成测试用例 五.详细设计文档描述 六.详细设计的评审 一.详细设计概述 1.出发点 详细…

Java前后端交互实现班级管理(查询)

1,数据库创建存储专业信息的表 2,后端: 连接数据库工具类DBUtil.java: package com.ffyc.webserver.util;import java.sql.*;public class DButils {static {try {Class.forName("com.mysql.cj.jdbc.Driver");} catch…

施耐德Unity通过Modbus控制变频器

硬件设备 PLC: Unity Premium (CPU:TSX P57154) 通讯卡: TSX SCP 114 连接电缆: TSX SCP CM 4030 VSD: ATV 58 硬件连接 Unity Premium (CPU: TSX P57154)本身不带Modbus接口,因此,采用TSX SCP 114扩展一个Modbus接口。TSX SCP 114是一个RS-485接…

java集合之Collection接口体系

一、集合概述 java集合框架标准化了程序处理对象组的方式,它是在J2SE 1.2版本时增加的。 在集合框架之前,Java提供了特定的类来存储和管理对象组,如Dictionary、Vector、Stack、Properties。尽管这些类很有用,但是缺少了集…

甲醇燃料电池(DMFC) 系统

甲醇燃料电池(DMFC) 系统框图 ~~