zoukankan      html  css  js  c++  java
  • 分享一个用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后点击登录:
    

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


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

    转发保留出处,
    有什么问题,欢迎探讨,谢谢支持!

  • 相关阅读:
    BZOJ 3997: [TJOI2015]组合数学 [偏序关系 DP]
    [Sdoi2017]新生舞会 [01分数规划 二分图最大权匹配]
    [Sdoi2017]相关分析 [线段树]
    [Sdoi2017]硬币游戏 [高斯消元 KMP]
    [Sdoi2017]序列计数 [矩阵快速幂]
    [Sdoi2017]树点涂色 [lct 线段树]
    [Sdoi2017]数字表格 [莫比乌斯反演]
    BZOJ 3160: 万径人踪灭 [fft manacher]
    Rabbitmq常见测试
    MQ(消息队列)功能介绍
  • 原文地址:https://www.cnblogs.com/GyForever1004/p/8330521.html
Copyright © 2011-2022 走看看