如何用QT技术实现长距离视频实时传输功能?

2026-04-12 10:581阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计633个文字,预计阅读时间需要3分钟。

如何用QT技术实现长距离视频实时传输功能?

本文以实例形式分享了实现视频传输功能的整体代码,供大家参考。具体内容如下:

如何用QT技术实现长距离视频实时传输功能?

前言:我们经常会进行视频传输,本文将讲解QT下的视频传输。

客户端:UDP客户端

我们主要讲解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)     {     } }

效果

总结

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

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

本文共计633个文字,预计阅读时间需要3分钟。

如何用QT技术实现长距离视频实时传输功能?

本文以实例形式分享了实现视频传输功能的整体代码,供大家参考。具体内容如下:

如何用QT技术实现长距离视频实时传输功能?

前言:我们经常会进行视频传输,本文将讲解QT下的视频传输。

客户端:UDP客户端

我们主要讲解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)     {     } }

效果

总结

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

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