基于QT+MQTT的实时视频监控

news/2024/12/19 15:07:36/文章来源:https://www.cnblogs.com/bliss-/p/18617286

MQTT(Message Queuing Telemetry Transport)是一种基于发布/订阅模式的轻量级通信协议,广泛应用于物联网领域。它允许设备通过极少的代码和有限的带宽实现实时可靠的消息服务。MQTT协议的核心在于其三部分组成的控制报文:固定报头、可变报头和有效载荷。

mqtt中的一些名词解释:https://www.cnblogs.com/bliss-/p/12508774.html

更多mqtt中文规范:https://www.mqtt.cn/mqtt-specification

一、说明

1.1

MQTT协议主要应用物联网设备的数据交互场景,专业的视频传输协议有RTMP、RTSP等。使用MQTT传视频主要是...玩

效果:

1.2 准备工作

  • mqttdocker:可以自己在本地搭建,也可以临时使用公共docker,自己搭建可选mosquitto:https://mosquitto.org/或者EMQX:https://www.emqx.cn/
  • UI图形库:C++QT
  • 视频来源:笔记本摄像头
  • qt的mqtt库需要自己编译完之后添加:https://www.cnblogs.com/bliss-/p/12378226.html

二、设计思路

2.1 采集端

  • 连接mqtt服务器
  • 打开摄像头
  • 每隔50ms使用摄像头拍照
  • 将拍到的照片转成二进制发送到指定的topic

2.2 接收端

  • 连接服务器
  • 订阅指定的topic,绑定消息接收的信号与槽
  • 接收到topic数据后将二进制数据转成JPG,显示在界面Label控件中

2.3 注意

  1. 数据发送时考虑到带宽与延时需要将拍照得到的照片等比例缩小
  2. 消息的服务等级设置为qos0,避免数据传输失败后重传

三、关键代码

  1. 摄像头打开、显示、拍照、截图、发送
//打开摄像头并显示
camera = new QCamera(this);
cameraViewFinder = new QCameraViewfinder(this);
ui->verticalLayout_2->addWidget(cameraViewFinder);
camera->setViewfinder(cameraViewFinder);
camera->start();
// 摄像头拍照并发送
cameraImageCapture = new QCameraImageCapture(camera);
cameraImageCapture->capture();
connect(cameraImageCapture,SIGNAL(imageCaptured(int,QImage)),this,SLOT(onImageCaptured(int,QImage)));
void MainWindow::onImageCaptured(int idx,QImage img)
{QPixmap pixMap = QPixmap::fromImage(img);pixMap = pixMap.scaled(600, 600, Qt::KeepAspectRatio);QBuffer buffer;buffer.open(QIODevice::ReadWrite);pixMap.save(&buffer,"jpg");m_client->publish(ui->lineEditTopic->text(), buffer.data(),0,0);
}
  1. mqtt建立连接、订阅主题、消息接收、解码JPG并显示
// mqtt配置
m_client = new QMqttClient(this);
m_client->setHostname(ui->lineEditHost->text());
m_client->setPort(ui->spinBoxPort->value());
m_client->setCleanSession(true);
// mqtt连接
m_client->connectToHost();
// 发布消息
m_client->publish(ui->lineEditTopic->text(), ui->lineEditMessage->text().toUtf8(),0,false);
// 订阅主题
connect(m_client, &QMqttClient::messageReceived, this, &MainWindow::on_msgRecv);
void MainWindow::on_msgRecv(const QByteArray &message, const QMqttTopicName &topic)
{QBuffer buffer((QByteArray *)&message);buffer.open(QIODevice::ReadOnly);QImageReader reader(&buffer,"JPG");QImage img = reader.read();if(!img.isNull()){QPixmap pix = QPixmap::fromImage(img);ui->label->setPixmap(pix.scaled(ui->label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));}
}

四、后续建议

  1. mqtt不适合传输视频,不建议使用
  2. 当前只传输画面,没有音频
  3. 数据的传输考虑加密、压缩
  4. mqtt不适合传输视频,不建议使用
  5. 可以使用UDP作为传输层协议的视频传输应用,tcp太消耗资源

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

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

相关文章

在 K8S 中创建 Pod 是如何使用到 GPU 的:nvidia device plugin 源码分析

本文主要分析了在 K8s 中创建一个 Pod 并申请 GPU 资源,最终该 Pod 时怎么能够使用 GPU 的,具体的实现原理,以及 device plugin、nvidia-container-toolkit 相关源码分析。1.概述 在 两篇文章中分别分享了在不同环境如何使用 GPU,以及在 k8s 中使用 GPU Operator 来加速部…

unity 协程

协程 异步执行 必须带关键字 yield return 0 ;程序暂时挂起

修改网站统计图标的位置,网站统计图标位置调整指南

修改网站统计图标的位置通常涉及编辑网站的HTML和CSS文件。以下是详细的步骤:确定修改需求:明确需要将统计图标移动到的具体位置。备份网站文件:在进行任何修改之前,建议先备份网站的所有文件。连接到FTP服务器:使用FTP客户端(如FileZilla、WinSCP等)连接到你的服务器。…

C语言浮点数相等判定

等价关系 按照离散数学的等价关系叙述,集合 \(X\) 上的关系 \(R \subset (X, X)\) 如果满足反身性: \((x, x) \in R, \forall x \in X\),自己等于自己 对称性: 如果 \((x, y) \in R\),则 \((y, x) \in R\),我等于你,则你也等于我 传递性: 如果 \((x, y) \in R\) 且 \((y, …

怎么修改网站admin密码,如何安全地修改网站后台管理系统的admin密码,提升安全性,防止未授权访问

修改网站后台管理系统的admin密码是确保网站安全的重要措施。以下是详细的修改步骤:登录后台管理系统:使用当前的admin账户登录网站后台管理系统。 确保使用的是最新的浏览器,以获得最佳的用户体验。进入用户管理页面:在后台管理系统中,找到“用户管理”或“管理员管理”选…

PbootCMS 织梦支付宝接口常见错误

错误代码 ILLEGAL_PARTNER:更新 PARTNER 值和安全校检码。 确认 PARTNER 值和安全校检码对应且有效。 确认 PARTNER 开通了所需的服务。错误代码 HAS_NO_PRIVILEGE:登录签约的支付宝账号,查询接口服务类型和合同生效时间。 确认服务名称、合同生效时间、合作者身份ID和校验码…

帝国CMS调用标题分类灵动标签

[e:loop={1,5,0,0}] 【<a href="<?=sys_ReturnBqInfoTypeUrl($bqr[ttid])?>"><?=class_tr[$bqr[ttid]][tname]?></a>】 <a href="<?=$bqsr[titleurl]?>" target="_blank"><?=$bqr[title]?>&l…

旅游开发团队协作,什么办公软件能增进默契?

冬季旅游市场具有独特的魅力与挑战,对于旅游公司而言,选择合适的团队协作办公软件至关重要。这些软件不仅要满足日常业务需求,更要契合冬季旅游的特殊情境,如应对旅游高峰期的高效协作、保障寒冷天气下旅游行程的顺利进行等。对于 MBTI 中的 J 人来说,有序、高效且可视化的…

SpringCodel微服务

SpringCodel微服务 docker启动命令: systemctl start docker 启动docker systemctl status docker 查看docker状态 systemctl enable docker 设置开机自启设置容器开机自启 docker update status=aways 容器名docker ps 格式化输出容器内容 (1)--format &qu…

验证云通行证失败, 请求连接无效

新合新公有云登录协同开发平台登录时提示"验证云通行证失败, 请求连接无效", 其他私有环境都正常 解决方案: 需要通过金蝶引导程序更新一下BOS程序

给我2分钟,保证教会你在Vue3中实现一个定高的虚拟列表

前言 虚拟列表对于大部分一线开发同学来说是一点都不陌生的东西了,有的同学是直接使用第三方组件。但是面试时如果你简历上面写了虚拟列表,却给面试官说是通过三方组件实现的,此时空气可能都凝固了。所以这篇文章欧阳将会教你2分钟内实现一个定高的虚拟列表,至于不定高的虚…

盘点2024年10款最热门LLM网关/AI网关

随着人工智能技术的飞速发展,将大型语言模型(LLM)部署到生产环节变得日益复杂。特别是在AI和基于LLM的API需求激增的当下,这一挑战尤为突出。Gartner的预测显示,到2026年,由AI和LLM工具驱动的API需求将激增超过30%,这无疑强调了高效模型管理的重要性。 在这方面,企业面…