文章目录
前言
本文主要介绍在 QT 中如何使用 QML 中的 VideoOutput 来显示由 C++ 代码生成到内存中的图像数据,要求读者对QML以及 QML 和 C++ 的交互方式有一定的了解。
关键词: QML VideoOutput C++
软硬件环境:
硬件:PC
软件:Windows11 Qt5.12.2
一、使用 VideoOutput 显示一张YUYV 图片实例
VideoOutput 是一个 QML Types, 用于显示图像数据,如下图所示,是Qt Creator IDE 环境中帮助文档中对videoOutput 的介绍
VideoOutput 常见的用法是 接收来自于MediaPlayer 或 Camera (QML Type)传递过来的数据进行显示 ,只需要简单的QML 代码就可以实现(本文就不介绍了)
如下图所示,是VideoOutput 的 source property 的官方描述, 要使用QML 的 VideoOutput 显示由C++ 代码生成的图像数据,VideoOutput 的source property 需要是基于 QObject 的类并提供可写 videoSurface 属性,可以接受基于 QAbstractVideoSurface 的类
Qt 官方帮助文档里面给的实例如下图所示
二、代码实例
1.创建 一个qml 工程
详见我之前的文章 使用Qt Creator 创建 一个 QML 工程(一)
2. 添加一个基于 QObject 并带有可写 videoSurface 属性的C++ class 到 qml 工程中
class videoframeprovider 的 videoframeprovider.h 代码如下
#ifndef VIDEOFRAMEPROVIDER_H
#define VIDEOFRAMEPROVIDER_H
#include <QObject>
#include <QAbstractVideoSurface>
#include <QVideoSurfaceFormat>
class videoframeprovider : public QObject
{
Q_OBJECT
Q_PROPERTY(QAbstractVideoSurface *videoSurface READ videoSurface WRITE setVideoSurface)
public:
explicit videoframeprovider(QObject *parent = nullptr);
~videoframeprovider();
QAbstractVideoSurface *videoSurface();
void setVideoSurface(QAbstractVideoSurface *surface);
Q_INVOKABLE void makedata();
void setFormat(int width, int heigth, QVideoFrame::PixelFormat format);
signals:
void newvideoFrame(const QVideoFrame &frame);
public slots:
void onNewVideoContentReceived(const QVideoFrame &frame);
private:
QAbstractVideoSurface *m_surface = nullptr;
QVideoSurfaceFormat m_format;
};
#endif // VIDEOFRAMEPROVIDER_H
class videoframeprovider 的 videoframeprovider.cpp 代码如下
#include "videoframeprovider.h"
#include <QFile>
videoframeprovider::videoframeprovider(QObject *parent)