最新信息:亚洲最大在线资源采集站,提供最新最快的影视资讯和在线播放-光速资源

优采云 发布时间: 2022-12-23 17:31

  最新信息:亚洲最大在线资源采集站,提供最新最快的影视资讯和在线播放-光速资源

  

  免责声明:源代码仅供学习和使用。 如果用于商业活动,与本人无关。 请勿利用本系统进行非法经营。 如学会用于非法经营,一切后果由您自行承担。 用它来违反中国法律。 用户与本站无关! 网站

  

  桂ICP备19007629号103号查询| 时间 7.332 秒 | 消耗 20.92MB 内存

  解决方案:QT 短时间大量图片传输,实现监控效果 (实时视屏传输) (暴力模式)

  1. 你首先需要知道什么

  1.我使用TCP协议进行传输,因为传输数据比较准确,

  2、然后是socket信号,readyRead(),这个信号的作用是只要socket中的缓冲区有数据,他就会发送这个信号。

  3、有时候我们传输数据的时候,会出现粘包、粘包的情况,读函数可能一次读不到数据。

  4、所以我们在传输数据的时候,需要传输一个标志,一个数据大小,数据,三个数据。

  标志位的作用:标志新数据从这里传出,

  data size的作用:可以很清楚的说明我们这次传输的图片数据的大小

  数据:图像的数据,转换为二进制。

  5、发送一张图片需要发送3次数据,就是要用到socket的write函数。 (使用 write 三次)

  2.代码解释,

  发送模块:

  QBuffer类型

  QBuffer是Qtl中的缓冲类

  缓冲区的本质是一个连续的存储空间

  QImage类型的save函数,将图像数据保存在buff中

  接收模块:

  1、首先我们接收到收录这部分的函数,然后因为有readRead()信号,所以在数据读取之前可以无限调用。

  2.type是一个标志

  3.size是数据的大小,

  4.data是数据总大小的集合,最终形成一张图片的数据。

  3.所有代码:

  服务器:pro文件+网络模块

  ui设计界面:

  头文件

  #ifndef WIDGET_H

#define WIDGET_H

#include

#include

/******* *敏*感*词*相关类 *****/

#include /*** *敏*感*词*类 ***/

#include /*** 系统*敏*感*词*属性类 ***/

#include /*** 用于记录*敏*感*词*数据的类 ***/

#include /*** debug 调试类 ****/

/******* 网络相关类 ****/

#include /** 网络访问类 ***/

#include /** 网络数据结果类 ***/

/******* QJSON 相关类 *****/

#include

#include

#include

#include /** TCP 服务器类 ***/

#include /** TCP 套接字类 ***/

#include //定时器

#include //时间类

#include //文件类

#include

#include

namespace Ui {

class Widget;

}

class Widget : public QWidget

{

Q_OBJECT

public:

explicit Widget(QWidget *parent = 0);

~Widget();

private slots:

void on_pushButton_open_clicked();

void on_pushButton_close_clicked();

private:

Ui::Widget *ui;

QCamera *m_Camera; /*** 摄像机类对象 ***/

QCameraImageCapture *CameraImageCapture; /*** 用于记录*敏*感*词*数据的类 ***/

QNetworkAccessManager *m_http; /**网络访问对象 **/

QTcpServer *sevser;//服务器的套接字的网络对象

QTimer* timer;//定时器

QTcpSocket * mycli;//连接的对象

public slots:

void solt_newConnection();

void slot_pushButton_play();//拍照按键

void slot_CameraImageCapture(int id, QImage image);//照片在界面上显示的函数

void slot_TcpSocket_disconnected();//TCP 断开连接

signals:

void send();

};

#endif // WIDGET_H

  .cpp 文件

  #include "widget.h"

#include "ui_widget.h"

<p>

#include

typedef unsigned char u8;

typedef unsigned short u16;

typedef unsigned int u32;

Widget::Widget(QWidget *parent) :

QWidget(parent),

ui(new Ui::Widget)

{

ui->setupUi(this);

timer = new QTimer(this);//定时器

sevser = new QTcpServer(this);

sevser->listen(QHostAddress::Any,10001);//*敏*感*词*开始

connect(sevser,SIGNAL(newConnection()),this,SLOT(solt_newConnection()));//建立信号连接 ,与链接的人

connect(ui->pushButton_play,SIGNAL(clicked(bool)),this,SLOT(slot_pushButton_play()));

//按键的初始化

ui->pushButton_close->setEnabled(false);//开始的时候 关闭*敏*感*词*的按钮不使能

}

Widget::~Widget()

{

delete ui;

}

void Widget::on_pushButton_open_clicked()//打开*敏*感*词*

{

ui->pushButton_open->setEnabled(false);//打开*敏*感*词*的按钮 不使能

ui->pushButton_close->setEnabled(true);//关闭*敏*感*词*的按钮 使能

/**** *敏*感*词*初始化 ****/

QCameraInfo camreinfo = QCameraInfo::defaultCamera(); /*** 获取系统默认*敏*感*词* ***/

if(camreinfo.isNull() == true)

{

QMessageBox::warning(this,"警告","系统没有可用*敏*感*词*");

return ;

}

/**** 申请*敏*感*词*类空间 ****/

m_Camera = new QCamera(camreinfo); // 直接使用系统默认的

m_Camera->setCaptureMode(QCamera::CaptureStillImage); //设置捕捉模式为静态帧(图片形式)

m_Camera->setCaptureMode(QCamera::CaptureMode::CaptureViewfinder); //将采集到取景器中

m_Camera->setViewfinder(ui->widget); //将*敏*感*词*数据输出到 UI 界面显示

m_Camera->start(); //*敏*感*词*打开

/***** 将*敏*感*词*放入*敏*感*词*记录类中,方便拍照 ******/

CameraImageCapture = new QCameraImageCapture(m_Camera);

CameraImageCapture->setCaptureDestination(QCameraImageCapture::CaptureToFile);

/*********** 捕获信号函数 imageCaptured(int,QImage) 拍了一张照,发出该信号 ********/

connect(CameraImageCapture,SIGNAL(imageCaptured(int,QImage)),this,SLOT(slot_CameraImageCapture(int,QImage)));

}

void Widget::on_pushButton_close_clicked()//关闭*敏*感*词*

{

ui->pushButton_close->setEnabled(false);//关闭*敏*感*词*的按钮 不使能

ui->pushButton_open->setEnabled(true);//开启*敏*感*词*的按钮使能

delete m_Camera; //释放他的空间

delete CameraImageCapture; //释放他的空间

}

void Widget::solt_newConnection()//连接成功之后的调试

{

qDebug()peerAddress(); /** 获取主机信息 **/

QString ip = hostaddr.toString();

int port = mycli->peerPort();

QString PORT = QString::number(port);

ui->listWidget->addItem(ip + " - " + PORT);//同步插入

connect(timer,SIGNAL(timeout()),this,SLOT(slot_pushButton_play()));

timer->start(30);

}

void Widget::slot_CameraImageCapture(int id, QImage image)

{

ui->label_3->setPixmap(QPixmap::fromImage(image));

bool ok = ui->checkBox->isChecked();

if(ok==true)

{

QByteArray data;

QBuffer buff(&data);

image.save(&buff,"jpeg");

u8 type = 0xAA; //接收到0xAA,我的长度来了

size_t size = data.size();

mycli->write((char *)&type,sizeof(type)); //发送类型

mycli->write((char *)&size,sizeof(size)); //发送长度

mycli->write(data); //发送数据

}

}

void Widget::slot_TcpSocket_disconnected()

{

  

qDebug()read((char *)&type,sizeof(type)); //读取类型

if(type == 0xAA)

{

TcpSocket->read((char *)&size,sizeof(size)); //读取类型

data.clear();

type = 0;

}

}

if(size > 0)

{

QByteArray buf = TcpSocket->read(size); //读取类型

data.append(buf);

size -= buf.size();

if(size label->setPixmap(QPixmap::fromImage(image));

}

}

}

</p>

  最后结果

  程序有bug(打开服务器的时候需要点击打开*敏*感*词*连接客户端,!!!!!!!!!) 可以自己改,调用的slot函数即可构建它时的按钮! ! !

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线