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

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;
    }
    else
        return -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 img
        zmq::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

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

待完善。

相关推荐
多弗朗皮卡丘5 小时前
C++STL之空间配置器
开发语言·c++·内存池·空间配置器
牵猫散步的鱼儿5 小时前
Demosaic 和 Remosaic
c++
CodeYp20195 小时前
第19讲:封装红黑树实现 mymap 和 myset
开发语言·c++·红黑树
音视频牛哥5 小时前
大牛直播SDK(SmartMediaKit)iOS平台Unity3D RTSP/RTMP播放器集成实践
音视频·unity3d·ios rtmp播放器·ios rtsp播放器·ios unity3d播放器·ios unity rtsp·ios unity rtmp
美狐美颜SDK开放平台5 小时前
视频美颜SDK如何应对快速转头与大幅度面部动作?
android·人工智能·ios·音视频·直播美颜sdk·视频美颜sdk
孙鹏宇.5 小时前
C++类型转换
c++
超级架构师6 小时前
让 COBOL 长出 AI 大脑:原生 Agent 核心框架 praxo-core 深度剖析
c语言·开发语言·c++·人工智能·python·架构·ai编程
·present·6 小时前
CSAPP(lecture 10)
c语言·c++
YLCHUP6 小时前
【模拟&STL】题解:AT_abc203_e [ABC203E] White Pawn_基础算法_数据结构_STL模板库_AtcoderABC_C++算法竞赛
数据结构·c++·算法·leetcode·动态规划·哈希算法·近邻算法
xiaolang_8616_wjl6 小时前
c++游戏_宝可梦大世界(源代码)
开发语言·c++·游戏