QT實(shí)現(xiàn)視頻傳輸功能
本文實(shí)例為大家分享了QT實(shí)現(xiàn)視頻傳輸功能的具體代碼,供大家參考,具體內(nèi)容如下
前言
我們經(jīng)常會(huì)進(jìn)行視頻的傳輸,這篇文章我們將講解QT下的視頻傳輸。
客戶(hù)端
udp客戶(hù)端,我們主要獲取某個(gè)視頻的文件,采用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()信號(hào)
?? ?{
?? ??? ?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);
}服務(wù)端
獲取客戶(hù)端數(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é)
一個(gè)簡(jiǎn)單的測(cè)試效果完成了,效果還不錯(cuò)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言庫(kù)函數(shù)qsort及bsearch快速排序算法使用解析
這篇文章主要為大家介紹了C語(yǔ)言庫(kù)函數(shù)qsort及bsearch快速排序算法的使用示例解析2022-02-02
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單回聲服務(wù)器
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單回聲服務(wù)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
史上最強(qiáng)C語(yǔ)言分支和循環(huán)教程詳解
這篇文章主要介紹了史上最強(qiáng)C語(yǔ)言分支和循環(huán)教程詳解,本文通過(guò)代碼演示給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11
C語(yǔ)言實(shí)現(xiàn)文件操作實(shí)例(簡(jiǎn)單圖示講解)
與普通文件載體不同,文件是以硬盤(pán)為載體存儲(chǔ)在計(jì)算機(jī)上的信息集合,文件可以是文本文檔、圖片、程序等等,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言實(shí)現(xiàn)文件操作實(shí)例的相關(guān)資料,需要的朋友可以參考下2023-02-02
C語(yǔ)言循環(huán)結(jié)構(gòu)與時(shí)間函數(shù)用法實(shí)例教程
這篇文章主要介紹了C語(yǔ)言循環(huán)結(jié)構(gòu)與時(shí)間函數(shù)用法,是C語(yǔ)言中非常重要的一個(gè)技巧,需要的朋友可以參考下2014-08-08
C語(yǔ)言實(shí)現(xiàn)選票統(tǒng)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)選票統(tǒng)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07
C語(yǔ)言解3元1次方程組 用初中學(xué)的最基本的聯(lián)合消元法
最近就想自己能不能先寫(xiě)個(gè)算線(xiàn)性方程組的程序呢?后來(lái)就想了這么個(gè)方法,暫時(shí)只能算3元的,任意元的接下來(lái)繼續(xù)想。有太多硬編碼,希望有興趣的讀者可以給點(diǎn)修改建議2013-11-11
C語(yǔ)言實(shí)現(xiàn)統(tǒng)計(jì)一行字符串的單詞個(gè)數(shù)
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)統(tǒng)計(jì)一行字符串的單詞個(gè)數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07

