QT实现视频传输功能

 更新时间:2022年08月18日 14:31:18   作者:God港  
这篇文章主要为大家详细介绍了QT实现视频传输功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了QT实现视频传输功能的具体代码,供大家参考,具体内容如下

前言

我们经常会进行视频的传输,这篇文章我们将讲解QT下的视频传输。

客户端

udp客户端,我们主要获取某个视频的文件,采用opencv读取后,分帧传输。我们将图片解码成base-64格式

参考代码

#include "ImageClient.h"
#include<QDebug>
#include<QBuffer>
#include<QFileDialog>
#include <opencv2/opencv.hpp>
ImageClient::ImageClient(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
    counter = 0;
    time = new QTimer(this);
    time->start(180);
    connect(time, SIGNAL(timeout()), this, SLOT(readFrame()));
    cap.open("F:/1.avi");
    if (!cap.isOpened())
    {
        qDebug() << " ===> Failed";
    }
    else
    {
        qDebug() << " ===> Succeed";
    }
    receiver = new QUdpSocket(this);
}
QByteArray ImageClient::getImageData2( QImage &image)
{
    QByteArray imageData;
    QBuffer buffer(&imageData);
    image.save(&buffer, "jpg");
    imageData = imageData.toBase64();
    return imageData;
}
QImage ImageClient::mat2QImage(cv::Mat cvImg)
{
    QImage qImg;

    if (cvImg.channels() == 3)                             //3 channels color image
    {
        cv::cvtColor(cvImg, cvImg, COLOR_BGR2RGB);
        qImg = QImage((const unsigned char*)(cvImg.data),
            cvImg.cols, cvImg.rows,
            cvImg.cols*cvImg.channels(),
            QImage::Format_RGB888);
    }

    else if (cvImg.channels() == 1)                    //grayscale image
    {
        qImg = QImage((const unsigned char*)(cvImg.data),
            cvImg.cols, cvImg.rows,
            cvImg.cols*cvImg.channels(),
            QImage::Format_Indexed8);
    }

    else
    {
        qImg = QImage((const unsigned char*)(cvImg.data),
            cvImg.cols, cvImg.rows,
            cvImg.cols*cvImg.channels(),
            QImage::Format_RGB888);
    }
    return qImg;
}
void ImageClient::readFrame()
{
    counter++;
    Mat source, result;
    qDebug() << counter;
    cap.read(source);
    if (source.empty())//如果视频已经读取完成则停止发送timeout()信号
    {
        time->stop();
        qDebug() << "End";
        return;
    }
    auto image = mat2QImage(source) ;
    ui.label->setPixmap(QPixmap::fromImage(image));
    auto data = getImageData2(image);
    receiver->writeDatagram(data.data(),
        data.size(),
        QHostAddress::Broadcast,    //udp广播地址
        7777);
}

服务端

获取客户端数据然后展现。代码如下:

#include "Server.h"
#include<QMutexLocker>
#pragma execution_character_set("utf-8")
Server::Server(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
    udpSocket = new QUdpSocket(this);
    udpSocket->bind(QHostAddress::AnyIPv4, 7777);
    connect(udpSocket, SIGNAL(readyRead()), this, SLOT(Run()), Qt::QueuedConnection);//udp数据接收        
    
}
QImage Server::getImage(const QString &data)
{
    QByteArray imageData = QByteArray::fromBase64(data.toLatin1());
    QImage image;
    image.loadFromData(imageData);
    return image;
}
void Server::Run()
{
    try
    {
        QMutexLocker locker(&mutexImage);
        datagram.resize(udpSocket->pendingDatagramSize());
        auto len = udpSocket->readDatagram(datagram.data(), datagram.size());
        auto image = Server::getImage(datagram);
        ui.label->setPixmap(QPixmap::fromImage(image));
        this_thread::sleep_for(std::chrono::milliseconds(180));
    }
    catch (const std::exception& e)
    {
    }
}

效果

总结

一个简单的测试效果完成了,效果还不错。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C语言库函数qsort及bsearch快速排序算法使用解析

    C语言库函数qsort及bsearch快速排序算法使用解析

    这篇文章主要为大家介绍了C语言库函数qsort及bsearch快速排序算法的使用示例解析
    2022-02-02
  • C语言实现简单回声服务器

    C语言实现简单回声服务器

    这篇文章主要为大家详细介绍了C语言实现简单回声服务器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 史上最强C语言分支和循环教程详解

    史上最强C语言分支和循环教程详解

    这篇文章主要介绍了史上最强C语言分支和循环教程详解,本文通过代码演示给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • C语言实现文件操作实例(简单图示讲解)

    C语言实现文件操作实例(简单图示讲解)

    与普通文件载体不同,文件是以硬盘为载体存储在计算机上的信息集合,文件可以是文本文档、图片、程序等等,下面这篇文章主要给大家介绍了关于C语言实现文件操作实例的相关资料,需要的朋友可以参考下
    2023-02-02
  • C语言循环结构与时间函数用法实例教程

    C语言循环结构与时间函数用法实例教程

    这篇文章主要介绍了C语言循环结构与时间函数用法,是C语言中非常重要的一个技巧,需要的朋友可以参考下
    2014-08-08
  • C语言实现选票统计

    C语言实现选票统计

    这篇文章主要为大家详细介绍了C语言实现选票统计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • C语言解3元1次方程组 用初中学的最基本的联合消元法

    C语言解3元1次方程组 用初中学的最基本的联合消元法

    最近就想自己能不能先写个算线性方程组的程序呢?后来就想了这么个方法,暂时只能算3元的,任意元的接下来继续想。有太多硬编码,希望有兴趣的读者可以给点修改建议
    2013-11-11
  • C++之谈谈构造函数的初始化列表

    C++之谈谈构造函数的初始化列表

    构造函数主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用,这篇文章详细介绍了构造函数的初始化列表,文章中有详细的示例代码,感兴趣的同学可以参考阅读
    2023-04-04
  • C++深度探索虚函数指针示例

    C++深度探索虚函数指针示例

    虚函数主要通过V-Table虚函数表来实现,该表主要包含一个类的虚函数的地址表,可解决继承、覆盖的问题,下面这篇文章主要给大家介绍了如何通过一篇文章带你掌握C++虚函数的来龙去脉,需要的朋友可以参考下
    2022-12-12
  • C语言实现统计一行字符串的单词个数

    C语言实现统计一行字符串的单词个数

    这篇文章主要介绍了C语言实现统计一行字符串的单词个数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07

最新评论