当前位置:网站首页>QT video transmission
QT video transmission
2022-07-07 16:58:00 【God port】
Preface
We often transmit video , In this article, we will explain QT Video transmission under .
client
udp client , We mainly get a video file , use opencv After reading , Framing transmission . We decode the picture into base-64 Format
Reference code
#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())// Stop sending if the video has been read timeout() The signal
{
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 Broadcast address
7777);
}
Server side
Get client data and show it . The code is as follows :
#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 Data reception
}
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)
{
}
}
effect

summary
A simple test effect is completed , It's not bad .
边栏推荐
- Cesium (4): the reason why gltf model is very dark after loading
- 【C 语言】 题集 of Ⅹ
- null == undefined
- Pisa-Proxy SQL 解析之 Lex & Yacc
- 最新2022年Android大厂面试经验,安卓View+Handler+Binder
- 《产品经理必读:五种经典的创新思维模型》的读后感
- LeetCode 1186. 删除一次得到子数组最大和 每日一题
- Three. JS series (2): API structure diagram-2
- typescript ts基础知识之tsconfig.json配置选项
- 【DesignMode】模板方法模式(Template method pattern)
猜你喜欢

1亿单身男女“在线相亲”,撑起130亿IPO

浅浅理解.net core的路由

运算符

《产品经理必读:五种经典的创新思维模型》的读后感

Three. JS series (2): API structure diagram-2
![[designmode] proxy pattern](/img/ed/642aebc7b49cbf4d30b517665b2438.png)
[designmode] proxy pattern

Talk about the realization of authority control and transaction record function of SAP system
3000 words speak through HTTP cache

无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

Vs2019 configuration matrix library eigen
随机推荐
time标准库
Pycharm IDE下载
LeetCode 1981. 最小化目标值与所选元素的差 每日一题
A tour of gRPC:03 - proto序列化/反序列化
模拟Servlet的本质
[C language] question set of X
ATM system
谈谈 SAP 系统的权限管控和事务记录功能的实现
数据中台落地实施之法
skimage学习(3)——Gamma 和 log对比度调整、直方图均衡、为灰度图像着色
Temperature sensor chip used in temperature detector
LeetCode 1155. 掷骰子的N种方法 每日一题
Cesium(3):ThirdParty/zip. js
LocalStorage和SessionStorage
Lie cow count (spring daily question 53)
QT中自定义控件的创建到封装到工具栏过程(一):自定义控件的创建
typescript ts 基础知识之类型声明
Usage of config in laravel
LeetCode 1049. 最后一块石头的重量 II 每日一题
The difference and working principle between compiler and interpreter