当前位置:网站首页>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 .
边栏推荐
- logback.xml配置不同级别日志,设置彩色输出
- 《产品经理必读:五种经典的创新思维模型》的读后感
- skimage学习(3)——使灰度滤镜适应 RGB 图像、免疫组化染色分离颜色、过滤区域最大值
- 【PHP】PHP接口继承及接口多继承原理与实现方法
- [designmode] proxy pattern
- LeetCode 300. 最长递增子序列 每日一题
- Opencv configuration 2019vs
- Laravel5.1 Routing - routing packets
- ByteDance Android gold, silver and four analysis, Android interview question app
- Horizontal and vertical centering method and compatibility
猜你喜欢
Vs2019 configuration matrix library eigen
谈谈 SAP 系统的权限管控和事务记录功能的实现
ByteDance Android gold, silver and four analysis, Android interview question app
Three. JS series (1): API structure diagram-1
C语言进阶——函数指针
skimage学习(3)——使灰度滤镜适应 RGB 图像、免疫组化染色分离颜色、过滤区域最大值
The latest interview experience of Android manufacturers in 2022, Android view+handler+binder
预测——灰色预测
作为Android开发程序员,android高级面试
最新高频Android面试题目分享,带你一起探究Android事件分发机制
随机推荐
QT中自定义控件的创建到封装到工具栏过程(一):自定义控件的创建
Advanced C language -- function pointer
Direct dry goods, 100% praise
Tidb cannot start after modifying the configuration file
skimage学习(2)——RGB转灰度、RGB 转 HSV、直方图匹配
二叉搜索树(基操篇)
【DesignMode】模板方法模式(Template method pattern)
DNS 系列(一):为什么更新了 DNS 记录不生效?
[vulnhub range] thales:1
Horizontal and vertical centering method and compatibility
LeetCode 1031. 两个非重叠子数组的最大和 每日一题
【MySql进阶】索引详解(一):索引数据页结构
Arduino 控制的双足机器人
AutoLISP series (3): function function 3
QT视频传输
[Android -- data storage] use SQLite to store data
[designmode] proxy pattern
skimage学习(3)——Gamma 和 log对比度调整、直方图均衡、为灰度图像着色
射线与OBB相交检测
【DesignMode】代理模式(proxy pattern)