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目录即可
CMakLists.txt长这样.
引入链接库的方法就是直接指向库文件就行.
安卓工程中, 唯一值得一提的就是修改app下面的build.gradle了.
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库
)
这里要使用arm64-v8a提示ndk的交叉编译器编译出来的jni库, 只需要arm64的, 因为3399是arm64平台, 理论上我 猜测, 因为安卓我确实不熟, 我猜测, 也可以用add语法, 加入其他平台的, 编译的时候会一起打包到apk文件中, 到时候应用层也好, 系统层也好, 能跟据自己的系统类型, 来选择对应的库.
接着通过jni运行rknn的例程, 就会发现, 驱动层跟应用层都已经升级到了1.7.5:
下面的示例代码是用一张原始640x640图片做的输入, ffmpeg融入的部分参考我github里面的ktplayer, 因为涉及商用利益冲突, 就不放完整的代码了.
- 分享
- 举报
-
david 2023-10-20 17:19:15回复 举报质量分享
-
搬砖中~ 2023-10-17 10:46:10回复 举报感谢大佬分享
-
Stranger 2023-10-17 09:08:38回复 举报感谢大佬分享
-
亮仔 工作微信[呲牙] 2023-10-16 17:39:19回复 举报可以呀,看完之后我的内心很澎湃,感觉又学到了无穷的知识,感谢老表的无私奉献
-
浏览量:2398次2023-11-01 20:42:22
-
浏览量:1113次2024-02-04 17:43:11
-
浏览量:5475次2019-12-05 17:50:07
-
浏览量:1763次2024-01-22 17:46:51
-
浏览量:1513次2024-02-05 10:41:25
-
浏览量:2289次2022-05-17 09:00:33
-
浏览量:5960次2021-12-10 16:15:34
-
浏览量:907次2023-12-07 01:07:22
-
浏览量:2452次2022-02-25 15:20:03
-
浏览量:6850次2020-12-17 09:45:27
-
浏览量:2212次2022-10-09 10:41:47
-
浏览量:2825次2024-05-22 15:23:49
-
浏览量:3452次2019-12-05 18:03:06
-
2020-12-09 13:43:37
-
浏览量:3137次2023-10-13 17:55:36
-
浏览量:4160次2021-09-10 13:46:25
-
浏览量:3978次2021-04-02 09:51:10
-
浏览量:3446次2022-05-17 09:00:46
-
浏览量:18200次2022-09-30 16:51:48
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
Marc
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明