分享一个用QT实现的Mjpeg-streamer客户端(简易版)
mainWindow代码如下(由于篇幅问题,子窗口代码不贴出了,有需要源码的可以留下邮箱):
/*
 *		Author : 博客园 Lance#
 */
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QUrl>
#include <QPixmap>
#include <QFile>
#include <qdebug>
#include <QPicture>
#include <QMessageBox>
/* 构造和析构 */
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
MainWindow::~MainWindow()
{
    delete ui;
}
/* 初始化函数,在子窗口中调用 */
void MainWindow::init()
{
    QString url;
    /* 创建一个用于应用程序发送网络请求和接收网络应答的"管理员" */
    manager = new QNetworkAccessManager(this);
	/* Mjpeg-streamer服务器的地址,这里我们获取的是snapshot而不是视频流,简单方便 */
    url.append("http://"+ipAddr+":"+port+"/?action=snapshot");
    qDebug() << url;
    /* 创建一个要发送的请求实例 */
    request = new QNetworkRequest(QUrl(url));
	/* 设置图像是否自适应Label, 用来实现图像的放大和缩小 */
    ui->label->setScaledContents(state);
    this->setWindowTitle("Camera Client");
    /* 隐藏图标 */
    this->setWindowFlags(this->windowFlags()&~(Qt::WindowMaximizeButtonHint|Qt::WindowCloseButtonHint));
}
/* 实现槽函数 */
void MainWindow::mjpeg_streamer_reply(QNetworkReply *reply)
{
	/* 读出全部数据 */
    QByteArray byteArr = reply->readAll();
	/* 构建pixmap */
    QPixmap pixmap;
    pixmap.loadFromData(byteArr);
	/* Label显示图像 */
    ui->label->setPixmap(pixmap);
    ui->label->show();
	/* 继续请求URL */
    manager->get(*request);
}
/* 双击实现放大缩小 */
void MainWindow::mouseDoubleClickEvent(QMouseEvent *)
{
    state = !state;
    ui->label->setScaledContents(state);
}
/* 开始/暂停 按钮点击槽函数 */
void MainWindow::on_button_start_clicked()
{
    QString name;
    if((btnStartSta = !btnStartSta) == false){
        name = "暂停";
        /* 设置"请求完成"与mjpeg_streamer_reply()这个槽关联 */
        connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(mjpeg_streamer_reply(QNetworkReply*)));
        /* 开始请求URL */
        manager->get(*request);
    }
    else{
        name = "开始";
        /* 解除关联,这样就不显示了 */
        disconnect(manager, SIGNAL(finished(QNetworkReply*)), this, NULL);
    }
    ui->button_start->setText(name);
}
/* 截图按钮槽函数 */
void MainWindow::on_button_snapshot_clicked()
{
    QDate date;
    QTime time;
	/* 取到当前显示的pixmap指针 */
    const QPixmap *pixmap = ui->label->pixmap();
    if(pixmap){
    	/* 保存为jpg文件,并保证名字不相同 */
        pixmap->save("Snapshot/Snapshot-"+date.currentDate().toString("yyyy,MM,dd")+"-"+
                     time.currentTime().toString("hh;mm;ss")+".jpg");
        QMessageBox::about(this, " ", "Save Successed!");
    }
}
/* 退出按钮槽函数 */
void MainWindow::on_button_exit_clicked()
{
    this->close();
}
客户端的使用是建立在你的服务器端已经搭好,服务器可以在PC、ARM板、路由....上实现。
命令行启动服务器,参数如下:

分辨率不要过高,会产生卡顿,( 毕竟我们是简单版 _ )
效果展示:
打开程序,子窗口如下:

输入IP,Port后点击登录:

点击开始,并可以放大、缩小:


点击截图,就可以保存当前画面,如图保存成功:

转发保留出处,
有什么问题,欢迎探讨,谢谢支持!
分享一个用QT实现的Mjpeg-streamer客户端(简易版)的更多相关文章
- 自定义View4-塔防小游戏第一篇:一个防御塔+多个野怪(简易版)*
		
塔防小游戏 第一篇:一个防御塔+多个野怪(简易版) 1.canvas画防御塔,妖怪大道,妖怪行走路线 2.防御塔攻击范围是按照妖怪与防御塔中心距离计算的,大于防御塔半径则不攻击,小于则攻击 ...
 - 分享一个14年写的用户管理类-swift版
		
AccountManager类 14年设计,从swift 0.9开始,迭代到现在swift4.0版本,总体几乎没什么改动,简单稳定. 其实现的思路主要还是借助之前net反射的经验,实现了自动保存用户信 ...
 - [QT] - MjpegStreamer客户端(简易版)#工程源码
		
简介: 大学时期学习弄的一个小软件,可以起到示例的作用,软件的几个功能截图如正文所示,文末提供工程源码文件,感谢支持! 功能截图: [ 开发板启动 mjpg_streamer 服务器 ] [ 启动软件 ...
 - 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)
		
分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...
 - 分享一个MySQL分库分表备份脚本(原)
		
分享一个MySQL分库备份脚本(原) 开发思路: 1.路径:规定备份到什么位置,把路径(先判断是否存在,不存在创建一个目录)先定义好,我的路径:/mysql/backup,每个备份用压缩提升效率,带上 ...
 - 分享一个与ABP配套使用的代码生成器源码
		
点这里进入ABP系列文章总目录 分享一个与ABP配套使用的代码生成器源码 真对不起关注我博客的朋友, 因最近工作很忙, 很久没有更新博客了.以前答应把自用的代码生成器源码共享出来, 也一直没有时间整理 ...
 - 分享一个常用Adb命令
		
分享一个常用Adb命令 首先 首先感谢@xuxu的常用adb命令,收益良多,但是已经不能满足于我,所以补充了下. 再者 好久没发帖了,最近论坛老司机们都在讨论/总结,我就用这个干货回报吧. 最后 基于 ...
 - 福利到~分享一个基于jquery的智能提示控件intellSeach.js
		
一.需求 我们经常会遇到[站内搜索]的需求,为了提高用户体验,我们希望能做到像百度那样的即时智能提示.例如:某公司人事管理系统,想搜索李XX,只要输入“李”,系统自然会提示一些姓李的员工,这样方便用户 ...
 - 分享一个oraclehelper
		
分享一个拿即用的oraclehelper 首先要引用本机中的oralce access,如果是64位的话,也必须是64位运行,不然会报连接为空connection 等于null. using Orac ...
 
随机推荐
- Waiting for table metadata lock
			
出现下图这个现象之前是在一张事务操作频繁地表上,执行了truncate操作. mysql.sock@(none)> select user,host,db,command,time,state, ...
 - PDF分享:国外优秀数学教材选评
			
<国外优秀数学教材选评>推荐书目下载 具体内容请查看原内容: http://www.library.fudan.edu.cn/wjzx/list/373-1-20.htm 或者http:/ ...
 - HTTP二、HTTP请求处理过程的七个步骤
			
HTTP02 HTTP请求处理过程的七个步骤 1.web服务处理步骤 web服务的处理过程可总结为七个步骤: 1)发起请求:客户端向服务器端发起连接请求,建立”三次握手“: 2)接收请 ...
 - java中的抽象类的作用
			
抽象函数的作用有很多,我就举一个例子,(mars老师的例子): 打印机: 父类---Printer 子类---HBPrinter 子类----CanonPrinter 测试类----Test //定义 ...
 - REdis主挂掉后复制节点才起来会如何?
			
结论: 这种情况下复制节点(即从节点)无法提升为主节点,复制节点会一直尝试和主节点建立连接,直接成功.主节点恢复后,复制节点仍然保持为复制节点,并不会成为主节点. 复制节点无法提升为主节点的原因是复制 ...
 - OC中重写set和get方法、懒加载
			
在写OC程序的时候,在很多时候我们会用到重写set或者get方法,重写这两个方法大多是用于刷新数据,比如懒加载. 意思就是说当你去调用set或者get方法时,系统会去调用重写的get或者set方法,这 ...
 - vue数据更新UI不刷新显示解决方案
			
vue比较常见的坑就是数据(后台返回)更新了,但是UI界面并没有更新,常见于以下情况: 一.数据为数组时1.通过数组索引修改数组元素例如: 此时UI数据并不会刷新 2.修改数组长度时: 解决方案: 如 ...
 - java持有对象-集合类
			
面阿里的时候,面试就让我说一下集合 当时由于条件原因没听清面试官的问题,后来面试后,面试官让问他问题的时候,才说明白是什么 下面就接受一下我了解的集合类 集合类中大致可以分为两个体系 一.collec ...
 - 中间件 activeMQ Jms Java Demo
			
一.什么是ActiveMQ 百度解释: ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provi ...
 - QEMU KVM libvirt手册(2): monitor
			
Administrating Virtual Machines with QEMU Monitor When QEMU is running, a monitor console is provide ...