日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

4.录屏软件录屏端和接收端程序

發布時間:2024/9/27 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 4.录屏软件录屏端和接收端程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


1 ?錄屏端程序案例

T30DeskSend.pro

SOURCES += \

??? main.cpp \

??? Sender.cpp

?

HEADERS += \

??? Sender.h

?

QT += network widgets

Sender.h

#ifndef SENDER_H #define SENDER_H ? #include <QObject> #include <QUdpSocket> ? class Sender : public QObject { ??? Q_OBJECT public: ??? explicit Sender(QObject *parent = 0); ? ??? QUdpSocket* _socket; ??? void sendFrame(const QByteArray& buf); ? signals: ? public slots: ??? void slotSendOneFrame(); }; ? #endif // SENDER_H

Sender.cpp

#include "sender.h" #include <QApplication> #include <QScreen> #include <QDesktopWidget> #include <QPixmap> #include <QBuffer> #include <QHostAddress> #include <QDateTime> ? Sender::Sender(QObject *parent) : ??? QObject(parent) { ??? _socket = new QUdpSocket; } ? void Sender::sendFrame(const QByteArray &buf) { ??? int blockSize = 1024; ??? //獲得塊的大小 ??? int blockCount = buf.size() / blockSize + ??????????? (buf.size() % blockSize > 0 ? 1 : 0); ? ??? //qint64表示的是:typedef long longcurrentMSecsSinceEpoch獲得時間額毫秒值 ??? qint64 timestamp = QDateTime::currentMSecsSinceEpoch(); ??? for(int i = 0; i < blockCount; i++) ??? { ??????? QByteArray block; ??????? //追加byte數組到byte數組中 ??????? block.append((char*)&timestamp, sizeof(timestamp)); ??????? block.append(char(blockCount)); ??????? block.append(char(i + 1)); ? ??????? block += buf.mid(i * blockSize,blockSize); ??????? //向指定地址的機器上發送數據,如果成功返回的是塊的大小,如果不成功返回-1 ??????? if(_socket->writeDatagram(block, block.size(), ?????????????? QHostAddress("127.0.0.1"), 10001) != block.size()){ ??????????? qDebug() <<"send error"<<i<<blockCount; ??????? } ??????? else ??????? { ??????????? qDebug() << "send block "<< i << blockCount; ??????? } ??? } } ? void Sender::slotSendOneFrame() { ??? //capture desktop ??? QPixmap pixmap = QApplication::screens().at(0)->grabWindow(QApplication::desktop()->winId()); ??? //pixmap.save("../desktop.jpg"); ? ??? QBuffer memFile; ??? //QBuffer.open()函數從QIODevice::open()函數重載實現 ??? memFile.open(QIODevice::ReadWrite); ??? pixmap.save(&memFile,"JPG"); ??? memFile.close(); ? ??? QByteArray buf = memFile.buffer(); ??? //發送數據 ??? sendFrame(buf); }

main.cpp

#include "sender.h" #include <QApplication> #include <QTimer> ? int main(int argc,char* argv[]) { ??? QApplication app(argc,argv); ??? Sender* sender = new Sender; ??? //這個靜態方法調用在給定的時間之后調用信號 ??? QTimer::singleShot(1, sender, SLOT(slotSendOneFrame())); ? ??? QTimer* timer = new QTimer; ??? app.connect(timer, SIGNAL(timeout()), sender, SLOT(slotSendOneFrame())); ??? timer->setInterval(1000 * 1800); ??? //開啟定時器 ??? timer->start(); ? ??? return app.exec(); }

?

編寫錄屏軟件接收端

T31DeskShow.pro

SOURCES += \

??? main.cpp \

??? Recver.cpp \

??? MyWidget.cpp

?

HEADERS += \

??? Recver.h \

??? MyWidget.h

?

QT += widgets gui network

Recver.h

#ifndef RECVER_H #define RECVER_H ? #include <QObject> #include <QUdpSocket> ? class Recver : public QObject { ??? Q_OBJECT public: ??? explicit Recver(QObject *parent = 0); ? ??? QUdpSocket* _socket; ??? QList<QByteArray> _blocks; ??? qint64 _timestamp; ? signals: ??? void sigFrameArrive(QByteArray ba); ? public slots: ??? void slotDataArrive(); ? }; ? #endif // RECVER_H

Recver.cpp

#include "Recver.h" #include <QDebug> ? Recver::Recver(QObject *parent) : ??? QObject(parent) { ??? _socket = new QUdpSocket; ??? //綁定端口 ??? _socket->bind(10001); ??? //? _socket->setSocketOption(); ??? //Sets the given option to the value described by value. ??? _socket->setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption, 1024*1024*8); ? ??? QVariant var = _socket->socketOption(QAbstractSocket::ReceiveBufferSizeSocketOption); ??? qDebug() << "recv buffer is"<< var; ? ??? connect(_socket, SIGNAL(readyRead()), this, SLOT(slotDataArrive())); ??? _timestamp = 0; } ? void Recver::slotDataArrive() { ??? //如果至少一個數據包等待讀取的時候,返回true,否則返回false ??? while(_socket->hasPendingDatagrams()) ??? { ??????? int size = _socket->pendingDatagramSize(); ??????? QByteArray buf(size,0); ??????? _socket->readDatagram(buf.data(),buf.size()); ? ??????? qint64 timestamp = *(qint64*)buf.data(); ??????? if(timestamp > _timestamp) ??????? { ??????????? qDebug() << "timestamp > _timestamp"; ??????????? _timestamp = timestamp; ??????????? _blocks.clear(); ??????? } ??????? else if(timestamp < _timestamp) ??????? { ??????????? qDebug() << "timestamp <? _timestamp"; ??????????? continue; ??????? } ? ??????? //emit this->sigFrameArrive(buf); ??????? _blocks.append(buf); ? ??????? int totalBlockCount = (uchar)_blocks.at(0).at(8); ??????? qDebug() << "recv block" << (int)totalBlockCount << (int)(uchar)buf[9]; ??????? //qDebug() << totalBlockCount << _blocks.size(); ??????? //如果塊兒的大小 == 總塊兒的數量 ??????? if(_blocks.size() == totalBlockCount) ??????? { ???????????? qDebug() << "recy frame"; ???????????? QByteArray frame; ???????????? for(int i = 0; i < _blocks.size();i++) ???????????? { ???????????????? frame += _blocks.at(i).mid(10); ???????????? } ???????????? _blocks.clear(); ???????????? emit this->sigFrameArrive(frame); ??????? } ??? } }

MyWidget.h

#ifndef MYWIDGET_H #define MYWIDGET_H ? #include <QWidget> ? class MyWidget : public QWidget { ??? Q_OBJECT public: ??? explicit MyWidget(QWidget *parent = 0); ? ??? QByteArray _buf; ??? void paintEvent(QPaintEvent *); signals: ? public slots: ??? void slotFrameArrive(QByteArray); }; ? #endif // MYWIDGET_H

MyWidget.cpp

#include "MyWidget.h" #include <QPainter> ? MyWidget::MyWidget(QWidget *parent) : ??? QWidget(parent) { } ? void MyWidget::slotFrameArrive(QByteArray ba) { ??? _buf = ba; ??? update(); } ? void MyWidget::paintEvent(QPaintEvent *) { ??? QPainter p(this); ??? QPixmap pixmap; ??? //加載數據從buf ??? pixmap.loadFromData(_buf, "JPG"); ??? //開始繪圖 ??? p.drawPixmap(0, 0, pixmap); }

main.cpp

#include <QApplication> #include "MyWidget.h" #include "recver.h" ? int main(int argc,char* argv[]) { ??? QApplication app(argc,argv); ? ??? MyWidget w; ??? w.show(); ? ??? Recver* recver = new Recver; ??? app.connect(recver, SIGNAL(sigFrameArrive(QByteArray)), ??????????????????? &w, SLOT(slotFrameArrive(QByteArray))); ? ??? return app.exec(); }

運行順序:先運行show端程序,在運行send端程序

178這類的表示發送的數據的大小

?

?

?

總結

以上是生活随笔為你收集整理的4.录屏软件录屏端和接收端程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。