海思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.谢谢

请多多支持!

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

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

相关文章

哈佛商业评论 | 未来商业的技术趋势:百度李彦宏谈技术如何变革商业

在《哈佛商业评论》的HBR IdeaCast节目中&#xff0c;百度联合创始人、首席执行官兼董事长李彦宏分享了他对人工智能&#xff08;AI&#xff09;和其他技术趋势的见解。这期节目讨论了百度如何将生成式AI融入业务&#xff0c;以及这些技术如何重塑我们的生活和工作方式。让我们…

插入排序——希尔排序

插入排序——希尔排序 7.5 插入排序——希尔排序概念和思路参考程序希尔排序的特性总结复杂度稳定性 7.5 插入排序——希尔排序 概念和思路 我们都知道&#xff0c;直接插入排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2)&#xff0c;但当数据无限接近有序或本身就是有序的时候&a…

Python小试牛刀:第一次爬虫,获取国家编码名称

使用场景&#xff1a; 需要初始化国家&#xff08;地区表&#xff09;&#xff0c;字段有国家名称、国家编码等等。 解决方案&#xff1a; 使用requests发送请求&#xff0c;使用bs4解析得到的HTML&#xff0c;打开F12&#xff0c;查看元素&#xff0c;&#xff08;可以Ctrl…

Java中的集合类与线程安全的讨论

1.ArrayList ArrayList是线程不安全的&#xff0c;可以在单线程中使用&#xff0c;在多线程中可以根据代码选择合适的时机进行加锁&#xff0c;实现线程安全的操作&#xff0c;但对代码能力要求较高。 2.Collections.synchronizedList(new ArrayList) 返回的List中的关键操作…

【数据结构】线性表——栈与队列

写在前面 栈和队列的关系与链表和顺序表的关系差不多&#xff0c;不存在谁替代谁&#xff0c;只有双剑合璧才能破敌万千~~&#x1f60e;&#x1f60e; 文章目录 写在前面一、栈1.1栈的概念及结构1.2、栈的实现1.2.1、栈的结构体定义1.2.2、栈的初始化栈1.2.3、入栈1.2.4、出栈…

A030-基于Spring boot的公司资产网站设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

企业生产环境-麒麟V10(ARM架构)操作系统部署kafka高可用集群

前言&#xff1a;Apache Kafka是一个分布式流处理平台&#xff0c;由LinkedIn开发并捐赠给Apache软件基金会。它主要用于构建实时数据流管道和流应用。Kafka具有高吞吐量、可扩展性和容错性的特点&#xff0c;适用于处理大量数据。 以下是Kafka的一些核心概念和特性&#xff1…

供应链管理、一件代发系统功能及源码分享 PHP+Mysql

随着电商行业的不断发展&#xff0c;传统的库存管理模式已经逐渐无法满足市场需求。越来越多的企业选择“一件代发”模式&#xff0c;即商家不需要自己储备商品库存&#xff0c;而是将订单直接转给供应商&#xff0c;由供应商直接进行发货。这种方式极大地降低了企业的运营成本…

机器学习 ---线性回归

目录 摘要&#xff1a; 一、简单线性回归与多元线性回归 1、简单线性回归 2、多元线性回归 3、残差 二、线性回归的正规方程解 1、线性回归训练流程 2、线性回归的正规方程解 &#xff08;1&#xff09;适用场景 &#xff08;2&#xff09;正规方程解的公式 三、衡量…

Unity类银河战士恶魔城学习总结(P127 Stat ToolTip属性提示)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了把鼠标放到属性上面就会显示属性的作用 UI_StatToolTip.cs 这段代码实现了一个UI提示框&#xff08;ToolTip&#xff09;功能…

C/C++语言基础--initializer_list表达式、tuple元组、pair对组简介

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 initializer_list表达式、tuple元组、pair对组再C日常还是比较常用的&#xff0c;尤其是对组在刷算法还是挺好用的&#xff0c;这里做一个简介&#xff1b;这三个语法结合C17的结构化绑定会更好用&#xff…

Python_爬虫1_Requests库入门

目录 Requests库 7个主要方法 Requests库的get()方法 Response对象的属性 爬取网页的通用代码框架 理解requests库的异常 HTTP协议及Requests库方法 HTTP协议 HTTP协议采用URL作为定位网络资源的标识。 HTTP协议对资源的操作 理解PATCH和PUT的区别 HTTP协议与Requse…

视频流媒体播放器EasyPlayer.js RTSP播放器视频颜色变灰色/渲染发绿的原因分析

EasyPlayer.js RTSP播放器属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;无须安装任何插件&#xff0c;起播快、延迟低、兼容性强&#xff0c;使用非常便捷。 EasyPlayer.js播放器不仅支持H.264与H.265视频编码格式&#xff0…

[JAVA]有关MyBatis环境配置介绍

什么是MyBatis环境配置&#xff1f; MyBatis是基于JDBC对数据库进行操作&#xff0c;在我们进行数据操作时&#xff0c;我们需要告诉MyBatis我们连接哪个数据库&#xff0c;ip地址&#xff0c;数据库名称&#xff0c;用户名密码等。以此来进行环境配置。 首先&#xff0c;MyB…

微搭低代码入门05循环

目录 1 for 循环2 while 循环3 do...while 循环4 break 语句5 循环展示组件总结 在编程中&#xff0c;循环是一种非常强大的控制结构&#xff0c;它允许我们重复执行一段代码直到满足某个条件为止。在微搭中&#xff0c;我们一般用循环来处理我们数据库返回的结果。 在微搭中&a…

11.13机器学习_线性回归

十 集成学习方法之随机森林 机器学习中有一种大类叫集成学习&#xff08;Ensemble Learning&#xff09;&#xff0c;集成学习的基本思想就是将多个分类器组合&#xff0c;从而实现一个预测效果更好的集成分类器。集成算法可以说从一方面验证了中国的一句老话&#xff1a;三个…

活动|华院计算作为联盟理事单位出席进博会全球人工智能合作论坛

第七届中国国际进口博览会&#xff08;进博会&#xff09;于11月5日至10日在上海举行&#xff0c;作为本次进博会的重要配套活动&#xff0c;首届人工智能全球合作论坛也于9日圆满落幕。本次论坛由全球招商中心委员会、人工智能全球合作论坛组委会主办&#xff0c;中国国际科技…

2、开发工具和环境搭建

万丈高楼平地起&#xff0c;学习C语言先从安装个软件工具开始吧。 1、C语言软件工具有两个作用 1、编辑器 -- 写代码的工具 2、编译器 -- 将代码翻译成机器代码0和1 接下来我们介绍两种C语言代码工具&#xff1a;devcpp 和 VS2019&#xff0c;大家可以根据自己的喜好安装。 dev…

【Qt实现虚拟键盘】

Qt实现虚拟键盘 &#x1f31f;项目分析&#x1f31f;实现方式&#x1f31f;开发流程 &#x1f31f;项目分析 需求&#xff1a;为Linux环境下提供可便捷使用的虚拟键盘OS环境&#xff1a;Windows 7/11、CentOS 7开发语言&#xff1a;Qt/C IDE&#xff1a;QtCreator 、Qt5.14.2功…

领夹麦克风哪个品牌好,手机领夹麦克风哪个牌子好,选购推荐

​无线麦克风凭借其无与伦比的便携性与灵活性&#xff0c;成为在演讲、表演以及会议等多种场合中不可或缺的有力帮手。它挣脱了线缆的束缚&#xff0c;使得声音的传播更加自由自在。其操作十分简便&#xff0c;只需简单配对就能投入使用&#xff0c;从而可以轻松地适应各类场景…