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 long,currentMSecsSinceEpoch获得时间额毫秒值
    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这类的表示发送的数据的大小

时间: 2024-08-10 11:25:36

4.录屏软件录屏端和接收端程序的相关文章

靠谱的录屏软件 + mp4格式转换软件

找一个靠谱的录屏软件不容易.有的有时间限制,有的有水印logo. 用到现在我比较满意的一款软件名字叫 ice cream screen recorder ,他没有水印 也没有时间限制. 唯一的缺点是录屏的同时不能同时录摄像头,录完之后文件的格式是mvk . 还需要下载一款格式转换工具把mvk格式的文件转为mp4文件. 这里推荐一个款格式转换工具bigasoft total video converter ,建议下载v5以上的中文破解版. 完美搞定.

电脑怎么录屏,电脑录屏软件怎么使用

因为工作的需要,我们经常需要在电脑录制视频,那么电脑怎么录屏呢?其实电脑录屏很简单,有款好用的电脑录屏软件就可以,比如说迅捷屏幕录像工具,下面小编就来说说电脑上录屏的具体方法. 桌面录屏软件http://www.xunjieshipin.com/download-luping 一.首先,我们下载我们在官网上下载电脑录屏软件,点击立即下载即可进行下载. 二.然后我们打开安装包,点击自定义安装,然后浏览设置它的文件安装目录,更换成功后我们点击立即安装即可进行安装,最后耐心等待安装完成即可. 三.安装

电脑有什么好用的录屏软件?电脑录屏软件

有时候用一款好用的录屏软件可以使我们录制电脑屏幕视频录制的非常顺畅,身心非常的舒服,那么电脑上有什么比较好用的录屏软件呢?小编觉得迅捷屏幕录像工具,下面小编就给大家分析分析,并分享下使用它录制电脑视频的具体方法. 桌面录屏软件http://www.xunjieshipin.com/download-luping 一.电脑什么录屏软件好用?一款好用的录屏软件,首先得保证我们录制下来的视频播放是十分顺畅的,其次就是保证画质是清晰的而又完美,支持多样的视频录制格式. 二.小编这有一款录屏软件就支持三种

简单实用的电脑视频录屏软件哪个好用?

电脑上面有很多不能下载的视频文件我想大家都是知道的,那么问题来了,如何去解决这件事情呢?这个时候就要用到桌面录屏软件了,其实录制电视视频特别简单,今天小编就来和你们一起探讨这款软件,说它简单实用一点毛病没有,快来和小编一起看看吧! 桌面录屏软件http://www.xunjieshipin.com/download-luping 屏幕录像工具http://www.onlinedown.net/soft/1152608.htm 软件介绍: 迅捷屏幕录像工具是一款即专业又好用的电脑录屏软件,支持教学

新手必学 手机录屏软件具体操作过程

很多新手宝宝们在下载了一款新的录屏大师软件之后去不知道该如何使用,或者觉得有些软件的操作程度太深,自己无从下手,面对这一问题,关于手机录屏软件具体操作过程,今天小编就来和你们一一说来,如果有感兴趣的宝宝可以一起往下看了. 录屏大师http://www.xunjieshipin.com/download-airscreen 安卓录屏软件http://www.pc6.com/softview/SoftView_600540.html 软件介绍: 迅捷录屏大师APP是一款适用于安卓手机的软件,它可以录

windows10桌面录屏软件哪个好

windows10拥有更安全的电脑防护,Win10作为一款不断更新的系统,各方面都能够保持最新,并且在界面设计上更符合当今潮流,这也是目前年轻用户追捧的重要原因.那么windows10桌面录屏软件哪个好呢?使用工具: 电脑(有网络)迅捷屏幕录像工具 操作步骤: 1.首先电脑在线进入百度浏览器搜索迅捷屏幕录像,并且安装在电脑上进行运行.也可以进入官网直接下载,这样更加方便.直接如下图所示:2.下载安装好之后,我们打开录屏软件,对整个录屏软件上方的功能区进行编辑,设置一些录制屏幕视频的相关参数.主要

Linux下的录屏软件Kazam

发现Ubuntu下一个很好用的录屏软件kazam,Ubuntu官方源中就有. 1.安装 $ sudo apt-get install kazam 2.使用 使用很简单,除了截图,还可以录制屏幕视频.既可以全屏录制,也可以对某个窗口和区域进行录制.使用界面如下图. =-=-=-=-=Powered by Blogilo 原文地址:https://www.cnblogs.com/pandachen/p/10801719.html

免费录屏软件之OBS Studio

好久没有再博客活动啦,今天给大家推荐一下录屏软件吧!首先我个人最喜欢的OBS Studio就说说它吧 1.免费.开源.功能强大.易上手 ? ? ? 下面是下载地址: 官网下载 : https://obsproject.com/ 官网下载速度较慢 百度网盘下载链接:https://pan.baidu.com/s/1RCoyRWSqkA7hu5Jlz_6tQA提取码:zk9j 其他的更多的免费改天在做分享吧! 原文地址:https://www.cnblogs.com/MiniTree/p/10896

免费小巧的录屏软件Captura

0.小巧好用的录屏软件,绝对好用 ? 1.下载地址 https://mathewsachin.github.io/Captura/download/ 2.安装 ? ? 因为我已经安装过,下面的步骤不在演示. 3.如何修改语言(汉化-软件汉化不是很完美) ? ? ? ? ? ? 本文到此结束.在此声明,图片地址为本人CSDN地址. https://blog.csdn.net/qq_35346390/article/details/102983142 https://blog.csdn.net/qq