分享一个用QT实现的Mjpeg-streamer客户端(简易版)

时间:2022-12-25 10:11:55

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板、路由....上实现。

命令行启动服务器,参数如下:

分享一个用QT实现的Mjpeg-streamer客户端(简易版)

分辨率不要过高,会产生卡顿,( 毕竟我们是简单版 _ )

效果展示:

打开程序,子窗口如下:

分享一个用QT实现的Mjpeg-streamer客户端(简易版)

输入IP,Port后点击登录:

分享一个用QT实现的Mjpeg-streamer客户端(简易版)

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

分享一个用QT实现的Mjpeg-streamer客户端(简易版)

分享一个用QT实现的Mjpeg-streamer客户端(简易版)

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

分享一个用QT实现的Mjpeg-streamer客户端(简易版)

转发保留出处,

有什么问题,欢迎探讨,谢谢支持!

分享一个用QT实现的Mjpeg-streamer客户端(简易版)的更多相关文章

  1. 分享一个14年写的用户管理类-swift版

    AccountManager类 14年设计,从swift 0.9开始,迭代到现在swift4.0版本,总体几乎没什么改动,简单稳定. 其实现的思路主要还是借助之前net反射的经验,实现了自动保存用户信 ...

  2. &lbrack;QT&rsqb; - MjpegStreamer客户端&lpar;简易版&rpar;&num;工程源码

    简介: 大学时期学习弄的一个小软件,可以起到示例的作用,软件的几个功能截图如正文所示,文末提供工程源码文件,感谢支持! 功能截图: [ 开发板启动 mjpg_streamer 服务器 ] [ 启动软件 ...

  3. 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  4. 分享一个MySQL分库分表备份脚本(原)

    分享一个MySQL分库备份脚本(原) 开发思路: 1.路径:规定备份到什么位置,把路径(先判断是否存在,不存在创建一个目录)先定义好,我的路径:/mysql/backup,每个备份用压缩提升效率,带上 ...

  5. 分享一个与ABP配套使用的代码生成器源码

    点这里进入ABP系列文章总目录 分享一个与ABP配套使用的代码生成器源码 真对不起关注我博客的朋友, 因最近工作很忙, 很久没有更新博客了.以前答应把自用的代码生成器源码共享出来, 也一直没有时间整理 ...

  6. 分享一个常用Adb命令

    分享一个常用Adb命令 首先 首先感谢@xuxu的常用adb命令,收益良多,但是已经不能满足于我,所以补充了下. 再者 好久没发帖了,最近论坛老司机们都在讨论/总结,我就用这个干货回报吧. 最后 基于 ...

  7. 福利到~分享一个基于jquery的智能提示控件intellSeach&period;js

    一.需求 我们经常会遇到[站内搜索]的需求,为了提高用户体验,我们希望能做到像百度那样的即时智能提示.例如:某公司人事管理系统,想搜索李XX,只要输入“李”,系统自然会提示一些姓李的员工,这样方便用户 ...

  8. 分享一个oraclehelper

    分享一个拿即用的oraclehelper 首先要引用本机中的oralce access,如果是64位的话,也必须是64位运行,不然会报连接为空connection 等于null. using Orac ...

  9. 分享一个ruby网站 &vert; 菜鸟教程

    http://www.runoob.com/ruby/ruby-tutorial.html 分享一个ruby网站.

随机推荐

  1. Intellij IDEA的一些东西

    Intellij IDEA的一些东西 2016-03-19 15:26 Ctrl + R 在当前文件进行文本替换 (必备) Ctrl + N 根据输入的 类名 查找类文件 Ctrl + Ctrl + ...

  2. overflow遭遇场景

    没有设置高度而由内容撑高的子div在遇到固定高度的父div,想做一个离上边缘有间距的效果,给padding-top会同时撑大父div,给margin-top会把父div拉下来,这时候的子div像是紧紧 ...

  3. 新手入门之GDB调试

    写这篇文章算是对最近两天工作的一个经验总结吧. 要让可执行文件比较方便地在DGB上调试,在用gcc编译的时候要使用-g选项. 如何使用GDB启动被调试程序? "gdb path_to_deb ...

  4. mongo 学习教程(全)

    看的是爱酷学习网的视频:http://www.icoolxue.com/album/show/98 01 安装 1.先建mongoDB-data文件夹存数据 2.安装DB 3.设置环境变量:把bin目 ...

  5. hadoop2 作业执行过程之reduce过程

    reduce阶段就是处理map的输出数据,大部分过程和map差不多 //ReduceTask.run方法开始和MapTask类似,包括initialize()初始化,根据情况看是否调用runJobCl ...

  6. rt-thread博客分享

    对于理解rtos, 国内有一个rt-thread的开源社区,里面讲解了一些rtos的很多概念,方便了理解很多问题点,博客地址如下: http://www.cnblogs.com/King-Gentle ...

  7. POJ2485——Highways

    Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public h ...

  8. gnome3

    http://askubuntu.com/questions/67753/how-do-i-add-an-application-to-the-dash https://wiki.gnome.org/ ...

  9. 绑定微信以及获取openId

    由于公司最近在做一个微信公众号的项目,需要获取用户openId,我再一次踏入了微信的坑! 先在这里告诫后来的同志,如果一样要开始做有关微信的东西,最好是有前辈,或者直接看完文档,不懂或者纳闷的地方直接 ...

  10. cain使用方法

    首先安装cain,这里就不废话了 1, 选择中核弹标志左边的按一下,然后在sniffer右键点击第一个扫描内网所有ip 扫描完后选择网关的IP下面选择arp标志,在按一下上方空格处,+号变得可以使用了 ...