海思3403对RTSP进行目标检测
1.概述
主要功能是调过live555 testRTSPClient 简单封装的rtsp客户端库,拉取RTSP流,然后调过3403的VDEC模块进行解码,送个NPU进行目标检测,输出到hdmi,这样保证了开发没有sensor的时候可以识别其它摄像头的视频流;
2.如何搭建一个RTSPServer
2.1使用live555 mediaServer搭建rtspServer
#这里可以去http://live555.com/官网查看
wget http://live555.com/liveMedia/public/live.2024.10.31.tar.gz
tar xvzf live.2024.10.31.tar.gz
cd live
./genMakefiles linux-no-std-lib
make -j
cd mediaServer
./live555MediaServer
执行的效果如下,默认支持的文件list如下,只需要把对应类型的文件复制到mediaServer目录即可,可以用vlc测试是否正常
LIVE555 Media Serverversion 1.13 (LIVE555 Streaming Media library version 2024.10.31).
Play streams from this server using the URLrtsp://192.168.8.8:8554/<filename>
where <filename> is a file present in the current directory.
Each file's type is inferred from its name suffix:".264" => a H.264 Video Elementary Stream file".265" => a H.265 Video Elementary Stream file".aac" => an AAC Audio (ADTS format) file".ac3" => an AC-3 Audio file".amr" => an AMR Audio file".dv" => a DV Video file".m4e" => a MPEG-4 Video Elementary Stream file".mkv" => a Matroska audio+video+(optional)subtitles file".mp3" => a MPEG-1 or 2 Audio file".mpg" => a MPEG-1 or 2 Program Stream (audio+video) file".ogg" or ".ogv" or ".opus" => an Ogg audio and/or video file".ts" => a MPEG Transport Stream file(a ".tsx" index file - if present - provides server 'trick play' support)".vob" => a VOB (MPEG-2 video with AC-3 audio) file".wav" => a WAV Audio file".webm" => a WebM audio(Vorbis)+video(VP8) file
See http://www.live555.com/mediaServer/ for additional documentation.
(We use port 8000 for optional RTSP-over-HTTP tunneling).)
2.2 ffmpeg转264文件
如果是mp4文件可以用ffmpeg简单的提取264文件,命令如下
#sudo apt-get install ffmpeg
ffmpeg -i input.mp4 -an -codec:v copy output.264
3.封装RtspClinet
代码参考live/testProgs/testRTSPClient.cpp
需要注意Nal头即可,不同RtspServer会有不同的发包方式
void DummySink::afterGettingFrame(unsigned frameSize,unsigned numTruncatedBytes,struct timeval presentationTime,unsigned /*durationInMicroseconds*/){//frameSize 这个是一帧图像// u_int8_t *fReceiveBuffer;这个是frame数据内容//struct timeval presentationTime,这个是当前frame的pts}
完整代码参考开源仓库下面目录
//thridpart/live555/librtspclient.h
RTSPCLI_API int MyRTSP_Init(RTSP_Handle** handle);/*句柄 返回0表示成功,返回非0表示失败 */
RTSPCLI_API int MyRTSP_Deinit(RTSP_Handle* handle);/* 释放RTSPClient 参数为RTSPClient句柄 */
RTSPCLI_API int MyRTSP_OpenStream(RTSP_Handle* handle, const char* _url, EASY_RTP_CONNECT_TYPE _connType,int _reconn/*1000表示长连接,即如果网络断开自动重连, 其它值为连接次数*/);/* 打开网络流 */
RTSPCLI_API int MyRTSP_SetCallback(RTSP_Handle* handle,RTSPSourceCallBack _callback, void* userptr);/* 设置数据回调 */
RTSPCLI_API int MyRTSP_Run(RTSP_Handle* handle);
RTSPCLI_API int MyRTSP_CloseStream(RTSP_Handle* handle);/* 关闭网络流 */
4.整合数据给VDEC
#include "librtspclient.h"
RTSP_Handle* hRTSPHandle_;
int RtspRunnig_ = 0;
pthread_t rtsp_thd_;
void *pRtspFrame = NULL;
static char sps[32];
static char pps[32];
static int spslen = 0;
static int ppslen = 0;
static int initvpss = 0;
static int RTSPSourceCall(EASY_FRAME_INFO_T frameinfo, void* userdata)
{// printf("frameinfo.framesize:%d,bIFrame:%d:NaluType:%d\n", frameinfo.framesize, frameinfo.bIFrame, frameinfo.NaluType);//这里做了简单是数据拼接,主要是为了给VDEC 完整的264帧,有问题可以调试下这部分数据,需要有nal头00 00 00 01 +xxx//I帧 nal+sps + nal+pps +nal +iframe//p帧 nal + pframeif (frameinfo.NaluType == 0x07){memcpy(sps, frameinfo.framebuff, frameinfo.framesize);spslen = frameinfo.framesize;return 0;}else if (frameinfo.NaluType == 0x08){memcpy(pps, frameinfo.framebuff, frameinfo.framesize);ppslen = frameinfo.framesize;return 0;}uint32_t len = 0;if (frameinfo.bIFrame){memcpy(pRtspFrame, sps, spslen);len += spslen;memcpy(pRtspFrame + len, pps, ppslen);len += ppslen;memcpy(pRtspFrame + len, frameinfo.framebuff, frameinfo.framesize);len += frameinfo.framesize;}else{memcpy(pRtspFrame + len, frameinfo.framebuff, frameinfo.framesize);len += frameinfo.framesize;}ot_vdec_stream stream;ot_vdec_chn vdecchn = 0;td_s32 milli_sec = 40;ot_vpss_grp grp = 0;ss_mpi_sys_get_cur_pts(&stream.pts);stream.addr = pRtspFrame;stream.len = len;stream.end_of_frame = TD_TRUE;stream.end_of_stream = TD_FALSE;stream.need_display = TD_TRUE;ss_mpi_vdec_send_stream(vdecchn, &stream, -1);ot_video_frame_info frame_info;ot_vdec_supplement_info supplement;ss_mpi_vdec_get_frame(vdecchn, &frame_info, &supplement, milli_sec);if (initvpss == 0 && frame_info.video_frame.width > 0){//第一帧解析成功才创建vpss通道ot_size in_size;in_size.width = frame_info.video_frame.width;in_size.height = frame_info.video_frame.height;printf("vpss init W: H:%d\n", in_size.width, in_size.height);sample_vio_start_vpss(grp, &in_size);initvpss = 1;}ss_mpi_vpss_send_frame(grp, &frame_info, milli_sec);ss_mpi_vdec_release_frame(vdecchn, &frame_info);return 0;
}
void* RtspProcess(void* args) {while (RtspRunnig_) {MyRTSP_Run(hRTSPHandle_);}printf("Rtsp thread Finish\n");return NULL;
}
void RtspStart(const char* url)
{pRtspFrame = malloc(1024*1024);RtspRunnig_ = 1;MyRTSP_Init(&hRTSPHandle_);MyRTSP_SetCallback(hRTSPHandle_, RTSPSourceCall, NULL);MyRTSP_OpenStream(hRTSPHandle_, url, EASY_RTP_OVER_TCP, 0);pthread_create(&rtsp_thd_, 0, RtspProcess, NULL);
}
void RtspStop()
{RtspRunnig_ = 0;MyRTSP_Deinit(hRTSPHandle_);pthread_join(rtsp_thd_, NULL);free(pRtspFrame);pRtspFrame = NULL;
}
5.完整Demo
后端处理的pipleline参考,直接把vdec流送给vpss,后面npu的部分在以前yolov8_deepsort_mp4分支中查看即可

6.工程代码
6.1代码仓库地址
giee仓库地址
6.2下载编译代码
git clone -b yolov8_deepsort_rtsp --depth=1 --single-branch https://gitee.com/apchy_ll/ss928_yolov5s.git
cd ss928_yolov5s
./build.sh
cp -rf output ~/work/nfs/3403/
6.3板端运行
./rundemo.sh rtsp://192.168.8.8:8554/output.264
7.教学视频
11 SS928 Yolov8检测RTSP流
8.谢谢
请多多支持!
相关文章:
海思3403对RTSP进行目标检测
1.概述 主要功能是调过live555 testRTSPClient 简单封装的rtsp客户端库,拉取RTSP流,然后调过3403的VDEC模块进行解码,送个NPU进行目标检测,输出到hdmi,这样保证了开发没有sensor的时候可以识别其它摄像头的视频流&…...
Vue之插槽(slot)
插槽是vue中的一个非常强大且灵活的功能,在写组件时,可以为组件的使用者预留一些可以自定义内容的占位符。通过插槽,可以极大提高组件的客服用和灵活性。 插槽大体可以分为三类:默认插槽,具名插槽和作用域插槽。 下面…...
分布式服务高可用实现:复制
分布式服务高可用实现:复制 1. 为什么需要复制 我们可以考虑如下问题: 当数据量、读取或写入负载已经超过了当前服务器的处理能力,如何实现负载均衡?希望在单台服务器出现故障时仍能继续工作,这该如何实现ÿ…...
基于yolov8、yolov5的车型检测识别系统(含UI界面、训练好的模型、Python代码、数据集)
摘要:车型识别在交通管理、智能监控和车辆管理中起着至关重要的作用,不仅能帮助相关部门快速识别车辆类型,还为自动化交通监控提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的车型识别模型,该模型使用了…...
机器学习—决定下一步做什么
现在已经看到了很多不同的学习算法,包括线性回归、逻辑回归甚至深度学习或神经网络。 关于如何构建机器学习系统的一些建议 假设你已经实现了正则化线性回归来预测房价,所以你有通常的学习算法的成本函数平方误差加上这个正则化项,但是如果…...
Java Optional详解:避免空指针异常的优雅方式
在 Java 编程中,空指针异常(NullPointerException)一直是困扰开发者的常见问题之一。为了更安全、优雅地处理可能为空的值,Java 8 引入了 Optional 类。Optional 提供了一种函数式的方式来表示一个值可能存在或不存在,…...
SpringBoot开发——整合EasyExcel实现百万级数据导入导出功能
文章目录 一、EasyExcel 框架及特性介绍二、实现步骤1、项目创建及依赖配置(pom.xml)2、项目文件结构3、配置文件(application.yml)4、启动类 Application.java5、配置类 EasyExcelConfig.java6、服务接口定义及实现 ExcelService.java7、控制器类 ExcelController.java8、…...
AcWing 1097 池塘计数 flood fill bfs搜索
代码 #include <bits/stdc.h> using namespace std;const int N 1010, M N * N;typedef pair<int, int> PII;int n, m;char g[N][N]; bool st[N][N]; PII q[M];void bfs (int xx, int yy) {int hh 0, tt -1;q[ tt] {xx, yy};st[xx][yy] true;while (hh <…...
R门 - rust第一课陈天 -内存知识学习笔记
内存 #mermaid-svg-1NFTUW33mcI2cBGB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1NFTUW33mcI2cBGB .error-icon{fill:#552222;}#mermaid-svg-1NFTUW33mcI2cBGB .error-text{fill:#552222;stroke:#552222;}#merm…...
java itext后端生成pdf导出
public CustomApiResult<String> exportPdf(HttpServletRequest request, HttpServletResponse response) throws IOException {// 防止日志记录获取session异常request.getSession();// 设置编码格式response.setContentType("application/pdf;charsetUTF-8")…...
信号-3-信号处理
main 信号捕捉的操作 sigaction struct sigaction OS不允许信号处理方法进行嵌套:某一个信号正在被处理时,OS会自动block改信号,之后会自动恢复 同理,sigaction.sa_mask 为捕捉指定信号后临时屏蔽的表 pending什么时候清零&…...
38配置管理工具(如Ansible、Puppet、Chef)
每天五分钟学Linux | 第三十八课:配置管理工具(如Ansible、Puppet、Chef) 大家好!欢迎再次来到我们的“每天五分钟学Linux”系列教程。在前面的课程中,我们学习了如何安装和配置邮件服务器。今天,我们将探…...
网络技术-定义配置ACL规则的语法和命令
定义ACL(访问控制列表)规则时,具体命令会根据所使用的设备和操作系统而有所不同。以下是一些常见的设备和操作系统中定义ACL规则的命令示例: 一:思科(Cisco)路由器/交换机 在思科设备中&#…...
动态规划一>子数组系列
题目: 2.解析: 代码: public int maxSubArray(int[] nums) {int n nums.length;int[] dp new int[n 1];int ret Integer.MIN_VALUE;for(int i 1; i < n; i){dp[i] Math.max(nums[i - 1], dp[i - 1] nums[i - 1]);ret Math.max(…...
一觉睡醒,全世界计算机水平下降100倍,而我却精通C语言——scanf函数
大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Fei Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。* 这一节我们主要来学习scanf的基本用法,了解scanf返回值,懂得scanf占位符和…...
Altium Designer使用技巧(五)
一、敷铜(快捷键T-G-A) 1、工具栏点“设计”—>“规则”。 可以修改覆铜连线的宽度,也可以选择“直接连接”使得铜和网络节点完全相连。 这里方式有三种,可根据需要各个人习惯去设置。 2、敷铜与线全链接 (1)少量的话可右键“…...
Docker 的安装与使用
Docker 的安装 Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。 Docker CE 的安装请参考官方文档…...
Android Studio 中三方库依赖无法找到的解决方案
目录 错误信息解析 解决方案 1. 检查依赖版本 2. 检查 Maven 仓库配置 3. 强制刷新 Gradle 缓存 4. 检查网络连接 5. 手动下载依赖 总结 相关推荐 最近,我在编译一个 Android 老项目时遇到了一个问题,错误信息显示无法找到 com.gyf.immersionba…...
PGMP练-DAY24
DAY241A program has completed and closed. The training for the receiving organization has also delivered. But the stakeholders still concern that the benefits cannot be realized in long term.What does the program manager review to improve the situation?项…...
【C++动态规划 最长公共子序列】1035. 不相交的线|1805
本文涉及知识点 C动态规划 LeetCode1035. 不相交的线 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足: nums1[i] nums2[j] 且绘制的…...
C++的std--ranges中的优化异构
C的std::ranges中的优化异构:现代编程的效率革命 C20引入的std::ranges库彻底改变了算法和容器的交互方式,其中优化异构(Heterogeneous Optimization)技术尤为引人注目。传统算法在处理不同类型的数据时,往往需要显式…...
LongCat-Image-Editn部署案例:中小企业低成本AI修图方案,替代Photoshop高频操作
LongCat-Image-Editn部署案例:中小企业低成本AI修图方案,替代Photoshop高频操作 重要提示:本文所有操作均在合规合法的网络环境下进行,所有技术方案均符合相关法律法规要求。 1. 引言:中小企业修图痛点与解决方案 对于…...
我花了 3 小时吃透:Spring AI 核心三剑客 ChatModel、Prompt、ChatResponse 到底怎么用?
你在学习 Spring AI 的时候,肯定遇到过这三个类:ChatModel、Prompt、ChatResponse看着眼熟,却总搞不清谁负责干嘛、代码里为啥要这么写?接下来就是我的理解。一、先搞懂:这三个东西是什么关系?在开始写代码…...
AR.js实战指南:如何在Web浏览器中构建高效增强现实应用
AR.js实战指南:如何在Web浏览器中构建高效增强现实应用 【免费下载链接】AR.js Image tracking, Location Based AR, Marker tracking. All on the Web. 项目地址: https://gitcode.com/gh_mirrors/arj/AR.js 在移动设备普及的今天,增强现实&…...
Opencascade避坑指南:Select()函数7个常见使用误区与调试技巧
Opencascade避坑指南:Select()函数7个常见使用误区与调试技巧 在三维建模和CAD开发领域,Opencascade作为一款强大的开源几何内核,其交互功能一直是开发者关注的焦点。而AIS_InteractiveContext中的Select()函数,作为对象选取的核心…...
Pixel Dimension Fissioner 与3D渲染结合:生成像素风格贴图与法线贴图
Pixel Dimension Fissioner 与3D渲染结合:生成像素风格贴图与法线贴图 1. 效果亮点预览 Pixel Dimension Fissioner在3D图形管线中展现出令人惊喜的适配性。这个工具最吸引人的地方在于,它能将传统像素艺术与现代3D渲染技术无缝结合,创造出…...
Ryujinx开源项目:跨平台Switch游戏模拟解决方案
Ryujinx开源项目:跨平台Switch游戏模拟解决方案 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 在数字化娱乐日益普及的今天,如何让Nintendo Switch游戏突破硬件…...
UniApp实战:如何安全高效地在安卓10+设备上实现本地数据存储(附权限配置避坑指南)
UniApp安卓10本地数据存储实战:权限配置与高性能方案设计 当你的UniApp在安卓10设备上突然无法保存用户配置时,控制台那行冰冷的"Permission denied"可能让整个开发团队陷入深夜加班。这不是简单的API调用问题,而是安卓存储机制变革…...
5分钟掌握游戏高清截图秘诀:SRWE窗口分辨率自定义完整教程
5分钟掌握游戏高清截图秘诀:SRWE窗口分辨率自定义完整教程 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否曾梦想为心爱的游戏角色拍摄一张高清壁纸,却发现游戏分辨率选项有限&…...
OpenClaw飞书集成实战:Qwen3-VL:30B智能对话与任务触发
OpenClaw飞书集成实战:Qwen3-VL:30B智能对话与任务触发 1. 为什么选择OpenClaw飞书组合 去年夏天,我接手了一个棘手的任务:团队每天产生上百条会议录音和杂乱无章的文档碎片,需要人工整理成结构化会议纪要。当我尝试用传统RPA工…...
