海思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 Server
	version 1.13 (LIVE555 Streaming Media library version 2024.10.31).
Play streams from this server using the URL
	rtsp://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 + pframe
    if (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.谢谢

请多多支持!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java知识】Java性能测试工具JMeter

一文带你了解什么是JMeter 概述JMeter的主要功能&#xff1a;JMeter的工作原理&#xff1a;JMeter的应用场景&#xff1a;JMeter的组件介绍&#xff1a; 实践说明JMeter实践基本步骤&#xff1a;JMeter实践关键点&#xff1a; JMeter支持哪些参数化技术&#xff1f;常见插件及其…

Github客户端工具github-desktop使用教程

文章目录 1.客户端工具的介绍2.客户端工具使用感受3.仓库的创建4.初步尝试5.本地文件和仓库路径5.1原理说明5.2修改文件5.3版本号的说明5.4结合码云解释5.5版本号的查找 6.分支管理6.1分支的引入6.2分支合并6.3创建测试仓库6.4创建测试分支6.5合并分支6.6合并效果查看6.7分支冲…

Flutter中的Material Theme完全指南:从入门到实战

Flutter作为一款热门的跨平台开发框架&#xff0c;其UI组件库Material Design深受开发者喜爱。本文将深入探讨Flutter Material Theme的使用&#xff0c;包括如何借助Material Theme Builder创建符合产品需求的主题风格。通过多个场景和代码实例&#xff0c;让你轻松掌握这一工…

EWM 打印

目录 1 简介 2 后台配置 3 主数据 4 业务操作 1 简介 打印即输出管理&#xff08;output management&#xff09;利用“条件表”那一套理论实现。而当打印跟 EWM 集成到一起时&#xff0c;也需要利用 PPF&#xff08;Post Processing Framework&#xff09;那一套理论。而…

2024 同一个网段,反弹shell四种方法【linux版本】bash、python、nc、villian反弹shell图解步骤

实验环境准备&#xff08;同一个网段下&#xff0c;我是桥接的虚拟机&#xff09; 一、bash反弹shell 二、python反弹shell 三、nc反弹shell 四、villain反弹shell 实验环境准备&#xff08;同一个网段下&#xff0c;我是桥接的虚拟机&#xff09; 一台kali的linux(攻击者)…

ubuntu 安装kafka-eagle

上传压缩包 kafka-eagle-bin-2.0.8.tar.gz 到集群 /root/efak 目录 cd /root/efak tar -zxvf kafka-eagle-bin-2.0.8.tar.gz cd /root/efak/kafka-eagle-bin-2.0.8 mkdir /root/efakmodule tar -zxvf efak-web-2.0.8-bin.tar.gz -C /root/efakmodule/ mv /root/efakmodule/efak…

算法沉淀一:双指针

目录 前言&#xff1a; 双指针介绍 对撞指针 快慢指针 题目练习 1.移动零 2.复写零 3.快乐数 4.盛水最多的容器 5.有效三角形的个数 6.和为s的两个数 7.三数之和 8.四数之和 前言&#xff1a; 此章节介绍一些算法&#xff0c;主要从leetcode上的题来讲解&#xff…

安全机制解析:深入SELinux与权限管理

Linux内核作为一个高自由度和优秀性能的操作系统核心&#xff0c;基于安全需求提供了完善的安全机制。内核安全机制不仅限于保护个人数据&#xff0c;还包括对运行环境和系统体系的线程化操作。本文将全方位分析Linux内核安全机制&#xff0c;以SELinux为主要代表&#xff0c;选…

对接阿里云实人认证

对接阿里云实人认证-身份二要素核验接口整理 目录 应用场景 接口文档 接口信息 请求参数 响应参数 调试 阿里云openApi平台调试 查看调用结果 查看SDK示例 下载SDK 遇到问题 本地调试 总结 应用场景 项目有一个提现的场景&#xff0c;需要用户真实的身份信息。 …

【2048】我的创作纪念日

机缘 2048天&#xff0c;不知不觉来csdn博客已经有2048天了&#xff0c;其实用csdn平台很久了&#xff0c;实际上写博客还是从2019年开始。 还记得最初成为创作者初心是什么吗&#xff1f; 最开始&#xff0c;主要是用来做笔记。平时工作中、学习中遇到的技术相关问题都会在cs…

docker运行ActiveMQ-Artemis

前言 artemis跟以前的ActiveMQ不是一个产品&#xff0c;原ActiveMQ改为ActiveMQ Classic, 现在的artemis是新开发的&#xff0c;和原来不兼容&#xff0c;全称&#xff1a;ActiveMQ Artemis 本位仅介绍单机简单部署使用&#xff0c;仅用于学习和本地测试使用 官网&#xff1a;…

[JAVA]MyBatis框架—如何获取SqlSession对象实现数据交互(基础篇)

假设我们要查询数据库的用户信息&#xff0c;在MyBatis框架中&#xff0c;首先需要通过SqlSessionFactory创建SqlSession&#xff0c;然后才能使用SqlSession获取对应的Mapper接口&#xff0c;进而执行查询操作 在前一章我们学习了如何创建MyBatis的配置文件mybatis.config.xm…

ThinkServer SR658H V2服务器BMC做raid与装系统

目录 前提准备 一. 给磁盘做raid 二. 安装系统 前提准备 磁盘和系统BMC地址都已经准备好&#xff0c;可正常使用。 例&#xff1a; 设备BMC地址&#xff1a;10.99.240.196 一. 给磁盘做raid 要求&#xff1a; 1. 将两个894G的磁盘做成raid1 2. 将两块14902G的磁盘各自做…

aws(学习笔记第十四课) 面向NoSQL DB的DynamoDB

aws(学习笔记第十四课) 面向NoSQL DB的DynamoDB 学习内容&#xff1a; 开发一个任务TODO管理器 1. 主键&#xff0c;分区键和排序键 DynamoDB的表定义和属性定义 表定义&#xff08;简单主键&#xff09; 表定义的命名需要系统名 _ 表名的形式&#xff0c;提前规划好前缀。…

机器学习—正则化和偏差或方差

正则化参数的选择对偏差和方差的影响 用一个四阶多项式&#xff0c;要用正则化拟合这个模型&#xff0c;这里的lambda的值是正则化参数&#xff0c;它控制着你交易的金额&#xff0c;保持参数w与训练数据拟合&#xff0c;从将lambda设置为非常大的值的示例开始&#xff0c;例如…

聚类分析 | MSADBO优化Spectral谱聚类优化算法

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于改进正弦算法引导的蜣螂优化算法(MSADBO)优化Spectral谱聚类&#xff0c;matlab代码&#xff0c;直接运行! 创新独家&#xff0c;先用先发&#xff0c;注释清晰&#xff0c;送MSADBO参考文献!优化参数 优化后的带…

STM32:ADC

目录 一、简介 二、结构 三、工作模式 四、使用流程 一、简介 模数转换器&#xff0c;ADC&#xff08;Analog-to-Digital Converter&#xff09;是将模拟信号转换为数字信号的电子设备。在STM32中&#xff0c;ADC用于处理来自传感器、麦克风等的模拟信号。STM32的ADC具有高…

candence : 如何利用EXCEL 绘制复杂、多管脚元件

如何利用EXCEL 绘制复杂、多管脚元件 前面的步骤直接略过 我们以STM32F407VEXX 系列 100pin 芯片为例讲解&#xff1a; 1、新建好一个空元件 2、使用阵列&#xff0c;放置管脚 点击 “ ok ” 3、选中所有管脚 右键 “edit properites” 出现如下页面 4、点击 左上角&…

vue内置指令和自定义指令

常见的指令&#xff1a; v-bind : 单向绑定解析表达式, 可简写为 :xxx v-model : 双向数据绑定 v-for : 遍历数组/对象/字符串 v-on : 绑定事件监听, 可简…

【ict基础软件赛道】真题-50%openGauss

题目取自赛前测试链接 OpenGauss安装前使用哪个工具检查环境是否符合安装哪个功能不是gs_guc工具提供的opengauss数据库逻辑复制的特点描述正确的是opengauss的全密态数据库等值查询能力描述正确的是哪个不属于ssh客户端工具opengauss三权分立说法正确的是opengauss wdr snapsh…