当前位置:网站首页>QT视频传输
QT视频传输
2022-07-07 15:32:00 【God港】
前言
我们经常会进行视频的传输,这篇文章我们将讲解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)
{
}
}
效果

总结
一个简单的测试效果完成了,效果还不错。
边栏推荐
- DNS 系列(一):为什么更新了 DNS 记录不生效?
- Module VI
- 如何选择合适的自动化测试工具?
- Personal notes of graphics (3)
- 最新Android面试合集,android视频提取音频
- 【DesignMode】外观模式 (facade patterns)
- [Android -- data storage] use SQLite to store data
- ORACLE进阶(六)ORACLE expdp/impdp详解
- Interface oriented programming
- Imitate the choice of enterprise wechat conference room
猜你喜欢

Temperature sensor chip used in temperature detector

Interface oriented programming
字节跳动Android金三银四解析,android面试题app

Personal notes of graphics (3)

使用JSON.stringify()去实现深拷贝,要小心哦,可能有巨坑

【DesignMode】代理模式(proxy pattern)

QT中自定义控件的创建到封装到工具栏过程(二):自定义控件封装到工具栏

【DesignMode】外观模式 (facade patterns)

"The" "PIP" "entry cannot be recognized as the name of a cmdlet, function, script file, or runnable program."

记录Servlet学习时的一次乱码
随机推荐
《产品经理必读:五种经典的创新思维模型》的读后感
Tragedy caused by deleting the console statement
[designmode] flyweight pattern
数据中台落地实施之法
华东师大团队提出,具有DNA调控电路的卷积神经网络的系统分子实现
LeetCode 1986. 完成任务的最少工作时间段 每日一题
As an Android Developer programmer, Android advanced interview
Laravel service provider instance tutorial - create a service provider test instance
time标准库
最新2022年Android大厂面试经验,安卓View+Handler+Binder
SqlServer2014+: 创建表的同时创建索引
【DesignMode】外观模式 (facade patterns)
Balanced binary tree (AVL)
【Android -- 数据存储】使用 SQLite 存储数据
LeetCode-SQL第一天
整理几个重要的Android知识,高级Android开发面试题
JS 模块化
作为Android开发程序员,android高级面试
Laravel post shows an exception when submitting data
掌握这套精编Android高级面试题解析,oppoAndroid面试题