QT實現(xiàn)視頻傳輸功能
更新時間:2022年08月18日 14:31:18 作者:God港
這篇文章主要為大家詳細介紹了QT實現(xiàn)視頻傳輸功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了QT實現(xiàn)視頻傳輸功能的具體代碼,供大家參考,具體內(nèi)容如下
前言
我們經(jīng)常會進行視頻的傳輸,這篇文章我們將講解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())//如果視頻已經(jīng)讀取完成則停止發(fā)送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); }
服務端
獲取客戶端數(shù)據(jù)然后展現(xiàn)。代碼如下:
#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數(shù)據(jù)接收?? ??? ? ?? ? } 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) ?? ?{ ?? ?} }
效果
總結(jié)
一個簡單的測試效果完成了,效果還不錯。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C語言數(shù)據(jù)結(jié)構鏈表隊列的實現(xiàn)
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構鏈表隊列的實現(xiàn)的相關資料,需要的朋友可以參考下2017-07-07Cocos2d-x UI開發(fā)之CCControlButton控件類實例
這篇文章主要介紹了Cocos2d-x UI開發(fā)之CCControlButton控件類實例,本文代碼中包含大量注釋來講解CCControlButton控件類的使用,需要的朋友可以參考下2014-09-09