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

mainWindow代码如下(由于篇幅问题,子窗口代码不贴出了,有需要源码的可以留下邮箱):

/*
 *      Author : 博客园 Lance# 
 */

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 
#include 
#include 
#include 
#include 

/* 构造和析构 */
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客户端(简易版)_第1张图片
分辨率不要过高,会产生卡顿,( 毕竟我们是简单版 ^_^ )

效果展示:
打开程序,子窗口如下:
分享一个用QT实现的Mjpeg-streamer客户端(简易版)_第2张图片

输入IP,Port后点击登录:

分享一个用QT实现的Mjpeg-streamer客户端(简易版)_第3张图片

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

分享一个用QT实现的Mjpeg-streamer客户端(简易版)_第4张图片
分享一个用QT实现的Mjpeg-streamer客户端(简易版)_第5张图片

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

分享一个用QT实现的Mjpeg-streamer客户端(简易版)_第6张图片

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

转载于:https://www.cnblogs.com/GyForever1004/p/8330521.html

你可能感兴趣的:(分享一个用QT实现的Mjpeg-streamer客户端(简易版))