91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用QT實現視頻傳輸功能

發布時間:2022-08-26 15:08:57 來源:億速云 閱讀:381 作者:iii 欄目:開發技術

這篇文章主要介紹“怎么用QT實現視頻傳輸功能”,在日常操作中,相信很多人在怎么用QT實現視頻傳輸功能問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么用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())//如果視頻已經讀取完成則停止發送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);
}

服務端

獲取客戶端數據然后展現。代碼如下:

#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數據接收        
    
}
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)
    {
    }
}

效果

怎么用QT實現視頻傳輸功能

到此,關于“怎么用QT實現視頻傳輸功能”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

qt
AI

新乐市| 淮滨县| 镶黄旗| 寿光市| 丹寨县| 汶上县| 河北省| 广汉市| 敖汉旗| 宣威市| 南汇区| 改则县| 贺兰县| 天祝| 宝丰县| 安西县| 怀远县| 偃师市| 三台县| 株洲县| 方城县| 依安县| 齐齐哈尔市| 道真| 东乌珠穆沁旗| 福鼎市| 佛教| 满城县| 彝良县| 垫江县| 韶关市| 天镇县| 乳源| 江永县| 盘山县| 彭山县| 固镇县| 葵青区| 临沭县| 澜沧| 三原县|