【USB网络摄像头】基于mjpeg-streamer的视频采集与播放【QT上位机软件】
前言
最近一直在尝试制作一个,网络摄像头,先后分别尝试了使用QT包装的UDP类TCP类,和LINUX中的socket编程等方式,但是非常遗憾,都没有取得非常好的播放效果。以为只要一帧一帧的传输视频数据就没有问题了,但是非常遗憾的是效果都不是非常好。因为对于数据的处理方法太过简单,不会写一些对于数据预先处理来减少数据的丢包,倒是播放出来的视频出现了如下的现象。
非常明显应为每一帧的图像之间出现了严重的粘连现象。搞了很久都没有找到解决问题的方法。最后还是选择了使用现成的开源框架mjpeg-streamer,并修改一些源码来实现自己功能。
网上很多的方法都是在浏览器中直接播放视频。但是项目需要一个上位机软件,然后我尝试了官方源码包中的那个QT上位机程序,但是好像应为版本的原因导致不能正常的编译。后来又在网上找了一些,拼拼凑凑总算搞定了。
软件部分
工程文件:
mjpeg-clint.pro
#-------------------------------------------------
#
# Project created by QtCreator 2020-03-08T18:33:52
#
#-------------------------------------------------QT += core gui networkgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = mjpeg-clint
TEMPLATE = app# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \mainwindow.cppHEADERS += \mainwindow.hFORMS += \mainwindow.ui
头文件:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QUrl>
#include <QPixmap>
#include <QFile>
#include <QPicture>
#include <QMessageBox>
#include <QMainWindow>
#include <QNetworkReply>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include<QTimer>namespace Ui {class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();void PicConnect(QString p);void SetWindow();void ShowPic();void StopPic();private slots:void on_buttonstart_clicked();void on_buttonsnapshot_clicked();void on_buttonclose_clicked();public slots:void slot_replyFinished(QNetworkReply* reply);private:Ui::MainWindow *ui;//connect to pictureQNetworkAccessManager *manager;bool isPicOnLabel;QImage* img=new QImage,* scaledimg=new QImage;QNetworkRequest request;QString ip;qint16 port;QString PU;};#endif // MAINWINDOW_H
源文件:
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"/* 构造和析构 */
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);setWindowTitle("客户端");PU="http://192.168.0.18:8080/?action=snapshot";manager = new QNetworkAccessManager(this);connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(slot_replyFinished(QNetworkReply*)));
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::PicConnect(QString PicUrl)
{request.setUrl(QUrl(PicUrl));manager->get(request);
}void MainWindow::slot_replyFinished(QNetworkReply* reply)
{QByteArray data = reply->readAll();img->loadFromData(data, "JPG");
}void MainWindow::on_buttonstart_clicked()
{if(isPicOnLabel==false){//获取服务器ip=ui->lineEditIP->text();port=ui->lineEditPORT->text().toInt();PU=QString("http://"+ip+":"+tr("%1").arg(port)+"/?action=snapshot");ShowPic();}else{StopPic();}
}void MainWindow::ShowPic()
{isPicOnLabel=true;QString name="暂停";while(1){if(isPicOnLabel==false)break;PicConnect(PU);//用作延时QEventLoop eventloop;QTimer::singleShot(10, &eventloop, SLOT(quit()));eventloop.exec();*scaledimg=img->scaled(640,480,Qt::KeepAspectRatio);ui->label->setPixmap(QPixmap::fromImage(*scaledimg));}
}void MainWindow::StopPic()
{QString name="开始";isPicOnLabel=false;
}void MainWindow::on_buttonsnapshot_clicked()
{QDate date;QTime time;/* 取到当前显示的pixmap指针 */const QPixmap *pixmap = ui->label->pixmap();if(pixmap){/* 保存为jpg文件,并保证名字不相同 */pixmap->save("./"+date.currentDate().toString("yyyy,MM,dd")+"-"+time.currentTime().toString("hh;mm;ss")+".jpg");QMessageBox::about(this, " ", "Save Successed!");}
}void MainWindow::on_buttonclose_clicked()
{this->close();
}
运行效果:
LINUX下:
Windows下
总结:
到目前为止视频的采集与播放基本已经搞定,下面我需要研究一些图像的编码与解码,包括使用ARM自身的硬编解码来对于图片快速的处理。同时还要进一步熟悉mjpeg-streamer源码。
工程源码:
mjpeg-clint
【USB网络摄像头】基于mjpeg-streamer的视频采集与播放【QT上位机软件】相关推荐
- FPGA驱动FT601实现USB3.0相机 OV5640视频采集 提供2套工程源码和QT上位机源码
目录 1.前言 2.FT601芯片解读和时序分析 FT601功能和硬件电路 FT601读时序解读 FT601写时序解读 3.我这儿的 FT601 USB3.0通信方案 4.vivado工程1--彩条视 ...
- FPGA驱动FT601实现USB3.0相机HDMI视频采集 提供工程源码和QT上位机源码
目录 1.前言 2.FT601芯片解读和时序分析 FT601功能和硬件电路 FT601读时序解读 FT601写时序解读 3.我这儿的 FT601 USB3.0通信方案 4.详细设计方案 5.vivad ...
- FPGA基于XDMA实现PCIE X4通信方案 提供工程源码和QT上位机程序和技术支持
目录 1.前言 2.我已有的PCIE方案 3.PCIE理论 4.总体设计思路和方案 5.vivado工程详解 6.驱动安装 7.QT上位机软件 8.上板调试验证 9.福利:工程代码的获取 1.前言 P ...
- usb网络linux系统安装教程,Linux系统入门学习:如何在树莓派上安装USB网络摄像头...
Question: 我可以在树莓派上使用标准的USB网络摄像头么?我该如何检查USB网络摄像头与树莓派是否兼容?另外我该如何在树莓派上安装它? 如果你想在树莓上拍照或者录影,你可以安装树莓派的摄像头板 ...
- Linux有问必答:如何在树莓派上安装USB网络摄像头
https://linux.cn/article-5312-1.html 2015-4-20 17:38 收藏: 4 参考原文:http://ask.xmodulo.com/install-us ...
- 2022年全球市场Type-C USB网络摄像头总体规模、主要生产商、主要地区、产品和应用细分研究报告
本文研究全球市场.主要地区和主要国家Type-C USB网络摄像头的销量.销售收入等,同时也重点分析全球范围内主要厂商(品牌)竞争态势,Type-C USB网络摄像头销量.价格.收入和市场份额等.针对 ...
- linux usb 网络摄像头,树莓派|Linux有问必答:如何在树莓派上安装USB网络摄像头...
Question: 我可以在树莓派上使用标准的USB网络摄像头么?我该如何检查USB网络摄像头与树莓派是否兼容?另外我该如何在树莓派上安装它? 如果你想在树莓上拍照或者录影,你可以安装树莓派的摄像头板 ...
- 网络摄像头的linux系统,Linux系统入门学习:如何在树莓派上安装USB网络摄像头...
Question: 我可以在树莓派上使用标准的USB网络摄像头么?我该如何检查USB网络摄像头与树莓派是否兼容?另外我该如何在树莓派上安装它? 如果你想在树莓上拍照或者录影,你可以安装树莓派的摄像头板 ...
- 在ROS中使用USB网络摄像头传输图像
转自:http://blog.csdn.net/yake827/article/details/44983093 在上节已经实现了单张图片的ROS实现,而在现实中,我们一般是使用摄像头来获取图像,这次 ...
最新文章
- iPhone上将短信内容发送到指定邮箱的方法
- Tensorflow的基本运行方式--demo程序
- vue --- 提交表单到服务器
- 在 git hooks 中运行 npm script
- ECG的滤波和检波资源汇总
- 移植SlidingMenu Android library,和安装example出现的问题解决
- CLR寄宿(上) MSCOREE.DLL
- linux mint17kde 安装教程,Kubuntu 14.04 /Linux Mint 17 怎样安装 KDE 4.14.1
- Unity(十九):获取编辑器内置样式和内置图标
- Android自定义签名文件 testkey.pk8 testkey.x509.pem
- 国际c语言混乱编码大赛,国际C语言混乱代码大赛(IOCCC)
- 2021-08-26小白笔记2
- 小众即时通信工具专项整治启动,关停“比邻”“聊聊”“密语”等9款违法App...
- VMWare安装苹果系统及相关问题处理
- 在网站页脚添加QQ邮箱的“邮我”功能
- Android自动电话录音开发过程及问题
- 流水不腐,户枢不蠹。运动多些。
- flex、grid布局实践——神仙网址分享
- JUC源码级学习(下)-函数式编程、stream流、jvm等
- 超定方程组最小二乘法(内含代码)