您的位置:首页 > 编程语言 > Qt开发

QT 支持多客户端网络视频监控的实现

2017-07-13 16:05 393 查看
QT里获取摄像头的单张数据:

cam = new QCamera;
capture = new QCameraImageCapture(cam);

connect(capture, SIGNAL(imageCaptured(int,QImage)), this, SLOT(image_ready(int,QImage))); //当捕捉一张图像数据后,触发槽函数,并传递图像数据作为参数

cam->setCaptureMode(QCamera::CaptureStillImage); //设置摄像头的工作模式为捕捉一张张的图像
cam->start();

capture->capture(); //捕捉开始,捕捉完成后,会发出信号imageCaptured(...)
//这种方式,每次获取图像时,都会在硬盘上保存起来,效率低.
//capture->setCaptureDestination(QCameraImageCapture::CaptureToBuffer); //设置捕捉的图像存放在内存数组里,还是会保存到硬盘上。估计是bug.


/////////////////////////////////////////////////

用摄像头预览模式:

cam = new QCamera;
view = new QCameraViewfinder(this);
view->setGeometry(0, 0, 640, 480);
view->show();

cam->setViewfinder(view);
cam->start();

//这种方式,图像会直接在view上刷出,不会保存到硬盘上。刷新速度快。但没法直接拿到图像数据.


在摄像头的预览模式下,可以通过截屏的方式来获取图像的数据:

QScreen *screen = QApplication::primaryScreen();
QPixmap map = screen->grabWindow(view->winId()); //只截view窗口对象上的图像,也就是摄像头的数据

//再编码成jpg图像
QByteArray ba;
QBuffer    bf(&ba);
map.save(&bf, "jpg", 50);

//完成后,图像数据在ba.data()里, 图像大小为ba.size();


//////////////////////////////////////////////////

网络传输的实现:

传输协议:

图像数据按1380字节分成多个部分,每次传输一部分数据.

客户端连接后,发出请求”new_request”, 服务器端发回”newImage:图像大小”

客户端发回”ack”, 服务器端发出第一部分数据,等接收到客户端的”ack”后,再发出下一部分数据…

服务器端:

1. 创建并初始化QTcpServer对象

2.  实现QCamera对象的预览模式

3.  用QList<QTcpSocket*>容器把每个客户端连接上来产生的QTcpSocket对象的地址。每个客户端的网速不一样, 所以在服务端每个QTcpSocket对象都需要存放自己的图像数据,已发出的数据长度,工作状态等 .


class Data {
public:
char data[LEN]; //图像数据
int  len; //图像大小
int  len_sent; //已发出的数据长度
int  stats; //工作状态, 0表示空闲(图像数据可以更新), 1表示图像数据传输中(还不可以更新图像数据), 2表示需要发出"newImage:图像大小"
Data() {
len_sent = 0;
stats = 0;
}
};

//  通过QObject里的setUserData(...)来设置每个QTcpSocket对象的Data对象
//  通过QObject里的userData(..)来获取每个QTcpSocket对象的Data对象


4.  定时通过截屏的方式来获取摄像头数据, 并根据每个QTcpSocket对象的工作状态来更新图像数据.
如是状态2,还需要发出"newImage:图像大小".


////////////////////////

客户端:

1. 创建QTcpSocket对象并连接服务器端

2.   连接上后,向服务器端发出"new_request"请求图像数据. 记录服务器端发回的图像大小. 再回"ack", 然后接收并存放好每部分的图像数据,直到接收完成后,把图像刷出来.


//////////////////////////////////////////////////////////////////////////////////////////

完整服务器端,客户端的工程下载:

http://download.csdn.net/download/jklinux/9897890
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qt 视频 网络