GB28181——实时视频显示

news2024/10/6 22:26:18

一、主要实现功能
1、支持四路设备接入
2、实时视频分屏显示
3、接入设备信息存储
二、待完善功能(现阶段)
1、设备的删除 (已更新)
2、语音对讲 (暂时不处理)
3、视频输出通道的实时修改 (已更新)
三、运行效果
1、参数配置
在这里插入图片描述
2、设备显示,显示所有添加的设备以及实时显示在线状态
在这里插入图片描述
3、视频输出
视频输出采用的GB28181协议通过UDP接收数据,ffmpeg进行数据处理显示,后面准备添加rtsp拉流功能
因为只有一台设备,暂时只能通过修改输出通道进行测试分屏显示
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
四、部分代码

//实现分屏
M_VideoWidget::M_VideoWidget(QWidget* parent)
	: QWidget{ parent }
{

}

void M_VideoWidget::init()
{
#ifndef no_style
	QStringList qss;
	qss.append("QFrame{border:2px solid #000000;}");
	qss.append("QLabel{font:75 25px;color:#F0F0F0;border:2px solid #AAAAAA;background:#303030;}");
	qss.append("QLabel:focus{border:2px solid #00BB9E;background:#555555;}");
	//将所有字符串接
	this->setStyleSheet(qss.join(""));
#endif

	//表格布局存放通道
	QGridLayout* gridLayout = new QGridLayout(this);

	gridLayout->setSpacing(1);
	gridLayout->setContentsMargins(0, 0, 0, 0);
	int height = this->height() / 2;
	int width = this->width() / 2;
	qDebug() << this->height() << this->width();
	int m_videoNume = 4;
	for (int i = 0; i < m_videoNume; ++i)
	{
		My_Glabel* widget = new My_Glabel(this);
		widget->setFixedHeight(height - 7);
		widget->setFixedWidth(width - 7);
		widget->setObjectName(QString("video%1").arg(i + 1));
		widget->installEventFilter(this);
		widget->setFocusPolicy(Qt::StrongFocus);
		// widget->setAlignment(Qt::AlignCenter);
		widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

		m_widget << widget;
	}
	gridLayout->addWidget(m_widget.at(0), 0, 0, 1, 1);
	gridLayout->addWidget(m_widget.at(1), 0, 1, 1, 1);
	gridLayout->addWidget(m_widget.at(2), 1, 0, 1, 1);
	gridLayout->addWidget(m_widget.at(3), 1, 1, 1, 1);

	this->setLayout(gridLayout);
}
void M_VideoWidget::setheight(int height)
{
	this->setFixedHeight(height);
}

void M_VideoWidget::setwidth(int width)
{
	this->setFixedWidth(width);
}

void M_VideoWidget::getWidgets(QList<My_Glabel*>& widget)
{
	int num = m_widget.size();


	widget = m_widget;
}

int M_VideoWidget::setIamge(int num, QImage image)
{
	m_widget.at(num)->setPixmap(image);
	return 0;
}
//UDP接收视频数据,对数据包进行处理,接收到一定数量的udp包后再进行数据的解析
void My_UdpServer::run()
{
	//ffmpeg初始化
	m_peg->init();

	int c;
	static struct {
		const char* name;
		t_format format;
	} formats[] = {
	  {"dump",    F_dump},
	  {"header",  F_header},
	  {"hex",     F_hex},
	  {"rtcp",    F_rtcp},
	  {"short",   F_short},
	  {"payload", F_payload},
	  {"ascii",   F_ascii}
	};

	t_format format = F_ascii;
	struct sockaddr_in sin, rtp;
	struct timeval start;
	struct timeval timeout;   /* timeout to limit recording */
	double dstart;            /* time as double */
	float duration = 1000000; /* maximum duration in seconds */
	int trunc = 1000000;   /* bytes to show for F_hex and F_dump */
	enum { FromFile, FromNetwork } source;
	int sock[2];
	
	fd_set readfds;
	extern char* optarg;
	extern int optind;
	int i;
	int nfds = 0;
	extern double tdbl(struct timeval*);	
	startupSocket();

	/* set maximum time to gather packets */
	timeout.tv_sec = duration;
	timeout.tv_usec = (duration - (float)timeout.tv_sec) * 1000000.0;

	/* if no optional arguments, we are reading from a file */
	source = FromNetwork;
	char ip[] = "192.168.1.22/30004";    //为测试方便这里暂时将ip与端口固定
	if (hpt(ip, &sin, NULL) == -1) {

		exit(1);
	}

	rtp = sin;
	nfds = open_network(ip, format != F_rtcp, sock, &sin);
	gettimeofday(&start, 0);
	dstart = tdbl(&start);
	format = F_payload;

#if 1	
	while (1)
	{
		int len;
		RD_buffer_t packet;
		struct timeval now;
		double dnow;

		if (source == FromNetwork)
		{
			FD_ZERO(&readfds);
			if (sock[0] >= 0) FD_SET(sock[0], &readfds);
			if (sock[1] >= 0) FD_SET(sock[1], &readfds);
			c = select(nfds + 1, &readfds, 0, 0, &timeout);
			if (c < 0)
			{
				perror("select");
				exit(1);
			}
			/* end of recording time reached */
			else if (c == 0)
			{
				if (verbose)
					fprintf(stderr, "Time limit reached.\n");
				exit(0);
			}
			for (i = 0; i < 2; i++)
			{
				if (sock[i] >= 0 && FD_ISSET(sock[i], &readfds))
				{
					int alen = sizeof(sin);

					/* subtract elapsed time from remaining timeout ,如果应用再linux 下需要注意以下的几个函数有所变化*/
					gettimeofday(&now, 0);
					dnow = tdbl(&now);
					timeout.tv_sec = duration - (dnow - dstart);
					if (timeout.tv_sec < 0) timeout.tv_sec = 0;
					
					len = recvfrom(sock[i], packet.p.data, sizeof(packet.p.data),
						0, (struct sockaddr*)&sin, &alen);
					qDebug("----- %s",inet_ntoa(sin.sin_addr));
					int channel = -1;
					M_Sqlite::inst()->findChannel(inet_ntoa(sin.sin_addr), channel);
					//data_Process(packet.p.data, len);
					data_Process(channel,packet.p.data, len);
				}
			}
		}
	}
#endif
}

五、补(两路摄像机数据显示)
在这里插入图片描述

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

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

相关文章

Nginx详细解说

1 什么是Nginx Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今&#xff0c;凭借开源的力量&#xff0c;已经接近成熟与完善。 Nginx功能丰富&#xff0c;可作为HTTP服务器&#xff0c;也可作为反向代理服务器&#xff0c;邮件服务器。支…

科技云报道:大模型的中场战事,深入垂直行业腹地

科技云报道原创。 自从OpenAI于2022年11月推出ChatGPT后&#xff0c;一场波及全球科技界的“AI海啸”就此爆发。 自今年以来&#xff0c;国内已有超过30家企业入局大模型赛道。从百度“文心一言”、阿里“通义千问”的发布&#xff0c;到网易“玉言”、科大讯飞“星火”、昆仑…

Centos7匹配Locust+prometheus+grafana性能监控平台

一、安装Loust 之前已写过&#xff0c;这里忽略一万字。。。 Locust初次体验【解决webUI没数据】_Vikesgao的博客-CSDN博客 二、安装prometheus Prometheus 是一个开源的服务监控系统和时序数据库&#xff0c;其提供了通用的数据模型和快捷数据采集、存储和查询接口。它的核心…

LLM:LLaMA模型和微调的Alpaca模型

待写 LLaMA模型 论文原文:https://arxiv.org/abs/2302.13971v1 预训练数据 模型架构 模型就是用的transformer的decoder,所以在结构上它与GPT是非常类似的,只是有一些细节需要注意一下。 1、RMS Pre-Norm 2、SwiGLU激活函数 3、RoPE旋转位置编码 Alpaca模型 [Stanford …

cuda编程学习——CUDA全局内存性能优化(八)

前言 参考资料&#xff1a; 高升博客 《CUDA C编程权威指南》 以及 CUDA官方文档 CUDA编程&#xff1a;基础与实践 樊哲勇 文章所有代码可在我的GitHub获得&#xff0c;后续会慢慢更新 文章、讲解视频同步更新公众《AI知识物语》&#xff0c;B站&#xff1a;出门吃三碗饭 …

Python3数据分析与挖掘建模(8)检验

1. 假设检验 1.1 概述 假设检验是一种统计推断方法&#xff0c;用于对一个或多个总体参数提出关于其取值的假设&#xff0c;并根据样本数据对这些假设进行检验。假设检验的目的是根据样本数据提供统计上的证据&#xff0c;以便对总体参数的假设进行接受或拒绝。 在假设检验中…

JAVA基础 - 如何使用ClassLoader?

1. CLASSLOADER是什么 ClassLoader&#xff0c;类加载器。用于将CLASS文件动态加载到JVM中去&#xff0c;是所有类加载器的基类(Bootstrap ClassLoader不继承自ClassLoader)&#xff0c;所有继承自抽象的ClassLoader的加载器&#xff0c;都会优先判断是否被父类加载器加载过&a…

C++数据结构:二叉树之二(二叉搜索树)

文章目录 前言一、二叉搜索树的概念二、代码详解1、构建节点2、构建二叉树类3、插入方法4、删除方法5、四种遍历方法6、测试代码 总结 前言 前文已经讲了二叉树概念&#xff0c;并搞出一个数组存储的没写具体实用意义的二叉树&#xff0c;这篇文章将讲解二叉树的另一种存储方式…

限量内测名额释放:微信云开发管理工具新功能

我们一直收到大家关于云数据库管理、快速搭建内部工具等诉求&#xff0c;为了给大家提供更好的开发体验&#xff0c;结合大家的诉求&#xff0c;云开发团队现推出新功能「管理工具」&#xff0c;现已启动内测&#xff0c;诚邀各位开发者参与内测体验。 什么是「管理工具」 管…

当节点内存管理遇上 Kubernetes:自动调度与控制

原理 在现代的容器化环境中&#xff0c;节点资源的管理是一个重要的任务。特别是对于内存资源的管理&#xff0c;它直接影响着容器应用的性能和可用性。在 Kubernetes 中&#xff0c;我们可以利用自动调度和控制的机制来实现对节点内存的有效管理。本文将介绍一种基于 Bash 脚…

EM中等效原理

EM中等效原理 一、基本简介 电磁等效定理对于简化许多问题的解是有用的。此外&#xff0c;它们还提供了对麦克斯韦系统电磁场行为的物理见解。它们与唯一性定理和惠更斯原理密切相关。一个应用是它们在研究来自孔径天线或来自激光腔输出的辐射中的用途。 等效源原理&#xf…

3.2 掌握RDD算子

一、准备工作 &#xff08;一&#xff09;准备文件 1、准备本地系统文件 2、把文件上传到HDFS &#xff08;二&#xff09;启动Spark Shell 1、启动HDFS服务 2、启动Spark服务 3、启动Spark Shell 二、掌握转换算子 &#xff08;一&#xff09;映射算子 - map() …

Sketch在线版免费使用,Windows也能用的Sketch!

Sketch 的最大缺点是它对 Windows/PC 用户不友好。它是一款 Mac 工具&#xff0c;无法在浏览器中运行。此外&#xff0c;使用 Sketch 需要安装其他插件才能获得更多响应式设计工具。然而&#xff0c;现在有了 Sketch 网页版工具即时设计替代即时设计&#xff01; 即时设计几乎…

通达信凹口平量柱选股公式,倍量柱之后调整再上升

凹口平量柱是一组量柱形态&#xff0c;表现为量柱两边高、中间扁平或圆底的形态。如下图所示&#xff0c;左右各有一根高度持平的高量柱&#xff0c;中间夹杂着三五根甚至更多根低量柱。 凹口平量柱选股公式需要结合量柱以及K线&#xff0c;主要考虑以下三点&#xff1a; 1、倍…

git各阶段代码修改回退撤销操作

git push origin master 的含义是将本地当前分支的提交推送到名为 origin 的远程仓库的 master 分支上。 各阶段代码修改回退撤销的操作 case1 git checkout -- . 修改了文件内容但没还有git add 或git commit时撤销当前目录下所有文件的修改 case2 当完成了git add 之后&a…

项目管理:面对未知的挑战时,如何获取和使用信息?

一项实验展示了人们在面对未知的挑战时&#xff0c;对信息的获取和使用的影响。在下面的实验中&#xff0c;三组人被要求步行到十公里外的三个村庄。 第一组人没有任何信息&#xff0c;只跟着向导走。他们在走了短短的两三公里后就开始抱怨和情绪低落&#xff0c;同时感到疲惫…

2022年天府杯全国大学生数学建模竞赛E题地铁线路的运营与规划解题全过程文档及程序

2022年天府杯全国大学生数学建模竞赛 E题 地铁线路的运营与规划 原题再现&#xff1a; 地铁是一种非常绿色快捷的交通出行方式&#xff0c;全国各大城市也都在如火如荼地进行地铁线路建设与规划。但乘坐地铁有时候会感觉特别拥挤&#xff0c;这一时期我们称为高峰期。如何合理…

sqlserver中的merge into语句

merge into语句是用来合并两张表的数据的&#xff0c;比如我们想把一张表的数据批量更新到另外一张表&#xff0c;就可以用merge into语句。具体有哪些业务场景呢&#xff1f; 1.数据同步 2.数据转换 3.基于源表对目标表进行增&#xff0c;删&#xff0c;改的操作。 实践步骤…

JavaScript了解调用带参函数,无参函数的代码

以下为JavaScript了解调用带参函数&#xff0c;无参函数的程序代码和运行截图 目录 前言 一、带参函数 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 二、无参函数 2.1 运行流程及思想 2.2 代码段 2.3 JavaScript语句代码 2.4 运行截图 前言…

让代码创造童话,共建快乐世界:六一儿童节特辑

让代码创造童话&#xff0c;共建快乐世界&#xff1a;六一儿童节特辑 六一儿童节即将来临&#xff0c;这是一个属于孩子们的快乐节日。为了让这个节日更加有趣&#xff0c;我们发起了“让代码创造童话&#xff0c;共建快乐世界”六一活动。在这个活动中&#xff0c;我们邀请您…