ZeroMq传输视频的几种方案

前言

        因为项目需要,现在需要使用ZeroMq去实现摄像头视频数据的传输,尝试了不少方法,以下是一些成功的汇总,定时更新:

    参考文章:

        ZeroMQ+OpenCV实现视频网络传输_zmq视频传输-CSDN博客 

        这个代码有点问题,需要微调,具体看我的代码方法一。

        因为我的开发环境是QT,以下以ubuntu20.04,QT5.12为例:

方法一:使用opencv和zeromq

原理:

        使用了opencv的接收摄像头数据,以及imencode和imdecode进行jpg的编解码。

发送端:

pro文件:

增加内容:LIBS += /usr/local/lib/libzmqpp-static.a -lzmq#opencv:******************************************
CONFIG      += link_pkgconfig
PKGCONFIG   += opencv4
LIBS        += -L/usr/lib/x86_64-linux-gnu/ -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs -lopencv_videoio
INCLUDEPATH += /usr/include/opencv4/opencv2
#*************************************************

main.cpp

#include <zmq.hpp>
#include <iostream>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>int main()
{zmq::context_t context(1);zmq::socket_t socket(context, zmq::socket_type::pub);socket.bind("tcp://*:5555");cv::VideoCapture cap(0);if (cap.isOpened()){std::cout << "摄像头已打开" << std::endl;std::cout << "图像宽度" << cap.get(cv::CAP_PROP_FRAME_WIDTH) << std::endl;std::cout << "图像高度" << cap.get(cv::CAP_PROP_FRAME_HEIGHT) << std::endl;}elsereturn -1;cv::Mat frame;while (cap.read(frame)){cv::Size dstSize = cv::Size(1280,960);cv::Mat dstFrame;cv::resize(frame, dstFrame, dstSize);std::vector<uint8_t> imageBuffer;std::vector<int> compress_params;compress_params.push_back(cv::IMWRITE_JPEG_QUALITY);compress_params.push_back(40);//压缩为原图像的x%,x in [0,100]cv::imencode(".jpg", dstFrame, imageBuffer, compress_params);//send imgzmq::message_t msg(imageBuffer.size());memcpy(msg.data(), imageBuffer.data(), imageBuffer.size());socket.send(msg, zmq::send_flags::dontwait);std::cout<<"send image, len:"<<imageBuffer.size() << std::endl;//cv::imshow("pub", dstFrame);cv::waitKey(1000 / cap.get(cv::CAP_PROP_FPS));}return 0;
}

接收端:

pro文件:

        同发送端相同。

main.cpp

#include <iostream>
#include <string>
#include <zmq.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace std;
int main (int argc, char *argv [])
{zmq::context_t context(1);zmq::socket_t socket(context, zmq::socket_type::sub);socket.connect("tcp://localhost:5555");  // 可以替换为其他地址socket.setsockopt(ZMQ_SUBSCRIBE, "", 0); // 设置订阅空字符串以接收所有消息cv::Mat frame;while (true) {zmq::message_t msg;auto ok = socket.recv(msg, zmq::recv_flags::dontwait);if (ok) {std::vector<uint8_t> buffer(static_cast<uint8_t*>(msg.data()), static_cast<uint8_t*>(msg.data()) + msg.size());std::cout << "Received image, len: " << msg.size() << std::endl;// 解码图像frame = cv::imdecode(buffer, cv::IMREAD_COLOR);cv::imshow("sub", frame);cv::waitKey(1);}}return 0;
}

方法二:gstreamer和zeromq,h264

待完善。

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

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

相关文章

详解 Flink 的运行架构

一、组件 1. JobManager 作业管理器是一个 Flink 集群中任务管理和调度的核心&#xff0c;是控制应用执行的主进程 1.1 JobMaster JobMaster 是 JobManager 中最核心的组件&#xff0c;负责处理单独的作业&#xff08;Job&#xff09;。JobMaster 和具体的 Job 是一一对应的&…

通过 SFP 接口实现千兆光纤以太网通信4

Tri Mode Ethernet MAC 与 1G/2.5G Ethernet PCS/PMA or SGMII 的连接 在设计中&#xff0c;需要将 Tri Mode Ethernet MAC 与 1G/2.5G Ethernet PCS/PMA or SGMII 之间通过 GMII 接口互联。Tri Mode Ethernet MAC IP 核的工作时钟源为 1G/2.5G Ethernet PCS/PMA or SGMII …

今日增长工具精选| 8个SaaS出海必备运营工具

一、SurveyMonkey 是一个灵活、方便、经济实惠的在线调查工具&#xff0c;可以通过自行设计定制化问卷&#xff0c;开展消费者调研&#xff0c;收集第一手数据&#xff0c;获取用户反馈。 客户涵盖财富100强公司以及其他不同规模和类型的组织&#xff0c;如公司、学术研究机构…

深入了解Java单例模式及其使用场景

什么是单例模式&#xff1f; 简单通俗来讲&#xff0c;单例模式是一种设计模式&#xff0c;它确保一个类只能有一个实例&#xff0c;并提供全局访问。在 Java 中&#xff0c;可以通过以下几种方式来实现线程安全的单例模式。 饿汉式单例 饿汉式单例模式指的是在类加载的时候…

Redis位图和地理空间GEO介绍与使用

1、位图 应用场景 在很多互联网应用中&#xff0c;我们会存在签到送积分、签到领取奖励等这样的需求&#xff0c;比如: 签到1天送10积分&#xff0c;连续签到2天送20积分&#xff0c;3天送30积分&#xff0c;4天以上均送50积分等。 如果连续签到中断&#xff0c;则重置计数&…

伯克希尔·哈撒韦:“股神”的“登神长阶”

股价跳水大家见过不少&#xff0c;但一秒跌掉62万美元的你见过吗&#xff1f; 今天我们来聊聊“股市”巴菲特的公司——伯克希尔哈撒韦 最近&#xff0c;由于纽交所技术故障&#xff0c;伯克希尔哈撒韦A类股股价上演一秒归“零”&#xff0c;从超过62万美元跌成185.1美元&…

关于main函数参数列表的那些事

写在最前面&#xff1a; 本篇博客所写代码&#xff0c;全部都依赖于Linux环境。 在开始之前&#xff0c;我们先问自己几个问题&#xff1a; main函数可以传参吗?如果main函数可以传参&#xff0c;最多可以传几个参数。main函数传递的参数具体作用是什么&#xff1f; 一.是否…

C++之类与类之间的关系

1、UML 2、继承&#xff08;泛化&#xff09; 3、关联 一个类对象与另一个类对象存在一个固定关系。他们的关系不是暂时的&#xff0c;而是固定的。 一个类对象作为另一个类对象的成员。例如订单&#xff0c;是用户的一个成员。用户关联订单。 4、聚合 聚合其实是特殊的一种…

渗透测试之内核安全系列课程:Rootkit技术初探(二)

今天&#xff0c;我们来讲一下内核安全&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 目前&#xff0c;在渗透测试领域&#xff0c;主要分为了两个发展方向&#xff0c;分别为Web攻防领域和PWN&#xff08;二进制安全&#xff09;攻防领域。在…

[office] 16种常见的COUNTIF函数公式设置 #笔记#职场发展

16种常见的COUNTIF函数公式设置 1、返回包含值12的单元格数量 COUNTIF(A:A,12) 2、返回包含负值的单元格数量 COUNTIF(A:A,"<0") 3、返回不等于0的单元格数量 COUNTIF(A:A,"<>0") 4、返回大于5的单元格数量 COUNTIF(A:A,">5"…

中国新闻网怎么投稿 新闻稿件文章如何发布到中国新闻网上,附中国新闻网价格明细

中国新闻网是中国最具影响力和权威性的新闻门户网站之一。作为广大作者和媒体从业者&#xff0c;怎样向中国新闻网投稿一直是一个备受关注的话题。在这篇文章中&#xff0c;我们将着重介绍媒介库网发稿平台&#xff0c;并分享如何在该平台上成功投稿至中国新闻网。 媒介库网发稿…

深度学习中tensorflow和pytorch框架有什么不同,该如何选择

Tensorflow与Pytorch的选择 1. 编程风格和易用性2. 社区和生态系统3. 性能和优化4. 选择建议 TensorFlow 和 PyTorch 是两种流行的深度学习框架&#xff0c;各有优缺点和特定的使用场景。以下是它们的主要区别以及选择时需要考虑的因素&#xff1a; 1. 编程风格和易用性 Tenso…

IDEA 2022

介绍 【尚硅谷IDEA安装idea实战教程&#xff08;百万播放&#xff0c;新版来袭&#xff09;】 jetbrains 中文官网 IDEA 官网 IDEA 从 IDEA 2022.1 版本开始支持 JDK 17&#xff0c;也就是说如果想要使用 JDK 17&#xff0c;那么就要下载 IDEA 2022.1 或之后的版本。 公司…

二叉树的非递归后序遍历

二叉树的后序遍历是一种深度优先遍历算法&#xff0c;其遍历顺序为&#xff1a;左子树 -> 右子树 -> 根节点。非递归实现后序遍历通常使用一个辅助栈来模拟递归过程。 以下是使用C实现二叉树非递归后序遍历的示例代码&#xff1a; #include <iostream> #include …

C语言.数据结构.双向链表

数据结构.双向链表 1.双向链表的结构1.1链表的简单介绍1.2图文分析 2.实现双向链表2.1链表的初始化2.1.1初始化2.1.2节点的申请 2.2链表的打印2.2.1代码实现2.2.2图文分析 2.3链表的尾插2.3.1代码实现2.3.2图文分析 2.4链表的头插2.4.1代码实现2.4.2图文分析 2.5链表的尾删2.5.…

CMMI软件能力成熟度评估标准

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl CMMI概述 CMMI&#xff0c;全称为Capability Maturity Model Integration&#xff0c;即能力成熟度模型集成&#xff0c;是在原有的CMM&#xff08;Capability Maturity Mo…

一文吃透!如何在鸿蒙上开发Unity游戏的方法!

实际效果&#xff1a; 使用 Webview 在鸿蒙设备上运行 Unity 游戏需要几个步骤&#xff1f; 用 Webview 在鸿蒙上运行 Unity 游戏 ①创建鸿蒙全屏工程 在 DevEco 中创建一个新工程&#xff0c;模板选择 Full Screen Ability。 ②添加 Webview 这个工程的布局很简单&#xf…

JavaScript中获取时间戳的方法

在 JavaScript 中获取时间戳的方法有多种&#xff0c;具体如下&#xff1a; 1.使用 Date 对象的 getTime() 方法获取当前时间的时间戳&#xff1a; var timestamp new Date().getTime(); 2.使用 Date 对象的 valueOf() 方法获取当前时间的时间戳&#xff1a; var timestamp n…

esp32-c6所有配套教程

1.介绍 本文是esp32-c6所有资料的介绍 如果需要详细代码的话请访问下面这个链接 esp32-c6使用教程wifi&#xff08;espidf修改成arduino&#xff09;附带代码websocket&#xff0c;舵机&#xff0c;点灯【2024年】-CSDN博客 配置环境 视频教程 0-2设置开发环境_哔哩哔哩_bi…