QT实现视频传输功能
本文实例为大家分享了QT实现视频传输功能的具体代码,供大家参考,具体内容如下
前言
【QT实现视频传输功能】我们经常会进行视频的传输,这篇文章我们将讲解QT下的视频传输。
客户端
udp客户端,我们主要获取某个视频的文件,采用opencv读取后,分帧传输。我们将图片解码成base-64格式
参考代码
#include "ImageClient.h"#include#include #include #include 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 = https://www.it610.com/article/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 = https://www.it610.com/article/getImageData2(image); receiver->writeDatagram(data.data(),data.size(),QHostAddress::Broadcast,//udp广播地址7777); }
服务端
获取客户端数据然后展现。代码如下:
#include "Server.h"#include#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 = https://www.it610.com/article/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){}}
效果
总结
一个简单的测试效果完成了,效果还不错。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
推荐阅读
- QT|QT UDP网络编程实现简单消息传输
- 解决Devc++运行窗口中文乱码的实现步骤
- C++文件的数据写入和文件的数据读取的方法实现
- C语言利用UDP实现群聊聊天室的示例代码
- python|python 实现syslog 服务器的详细过程
- 投稿|分账剧成为长视频“收纳箱”?
- python证件照换底色_python利用opencv实现证件照换底
- OpenShift|OpenShift 4 - 使用 Debezium 捕获变化数据,实现MySQL到PostgreSQL数据库同步
- 图文视频教程|Jenkins详细教程
- [博客园首发]|[博客园首发] 写连载博客,历时1410天出版书籍《物联网软件架构设计与实现》