最新信息:亚洲最大在线资源采集站,提供最新最快的影视资讯和在线播放-光速资源
优采云 发布时间: 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函数即可构建它时的按钮! ! !