文章目录
klipper监控图像外传
技术路径
局域网内流数据传输。
外网,搭建服务器,帧数据传输。
外网流数据传输很贵。
moonraker
需要在在moonraker.conf里定义摄像头的配置和url,才能通过ip:/192.168.1.122/webcam/?action=stream读取到摄像头画面,然后可以传输mjpeg流。
至此,在qml可以通过双image定时缓冲法,进行帧数据传输,效果凑合,一卡一卡的。
也可以通过videooutput进行流数据传输,但是延迟居高不下。
webengine可以完美实现这个功能,但是其商用需付费,因此得自行复刻。
实现过程及代码
技术路径
① 已知摄像头传递的画面的ip地址"http://192.168.2.2/webcam/?action=stream"
② [CameraManagerModel] C++后端通过QUrl,QNetworkAccessManager,QNetworkReply拉去流数据,
③ [ImageProvider] 再通过QQuickImageProvider将帧画面实时刷新到qml前端。
刷新数据很快。
github地址
https://github.com/Vaticann/QQuickImageProvider_test_qml.git
CameraManagermodel的代码展示如下
cameramanagermodel.h
#ifndef CAMERAMANAGERMODEL_H
#define CAMERAMANAGERMODEL_H
#include <mutex>
#include <QObject>
#include <QTimer>
#include <QDebug>
// 复刻webengine添加的
#include <QImage>
#include <QUrl>
#include <QNetworkAccessManager>
#include <QNetworkReply>
/////// 新model必有
class CameraManagerModel: public QObject //, public KeyboardCaller // 热床需要键盘
{
Q_OBJECT // 宏 必须单独放在类定义的最前面,宏会生成元对象代码(如信号、槽、属性等),
// 这些代码需要在类定义的最前面插入,不能和其他成员混在一起。
public:
static CameraManagerModel &instance() // 全局单例模式要有这个static
{
static CameraManagerModel _instance;
return _instance;
}
////////
public:
// QML可读属性,让它知道这个变量代表 当前帧图片
Q_PROPERTY(QImage currentFrame READ currentFrame NOTIFY frameReady)
// 显式构造函数,在类构造时,创建一个指向父对象的指针。父对象销毁时自动销毁所有子对象,包括这里
CameraManagerModel

最低0.47元/天 解锁文章
1150

被折叠的 条评论
为什么被折叠?



