当前位置: 首页 > news >正文

qml显示视频帧(QQuickImageProvider)

一、实现方式

解码视频可以选择:opencv、ffmpeg等。

显示视频可以选择:Qt Multimedia、QQuickImageProvider、ShaderEffect、自定义QQuickItem等。

本文使用opencv解码视频,QQuickImageProvider显示视频。

二、QQuickImageProvider 中,requestImage 和 requestTexture区别 

在 QQuickImageProvider 中,requestImage 和 requestTexture 的区别主要体现在 调用时机返回数据类型 和 性能优化 上。以下是详细对比:

 核心区别

特性requestImagerequestTexture
返回类型QImage(CPU 内存中的图像)QQuickTextureFactory*(GPU 纹理工厂)
调用时机QML 需要 CPU 可操作的图像时(如截图、软件处理)QML 需要直接渲染到 GPU 时(如视频、动画)
性能较高开销(需 CPU → GPU 上传)高性能(直接生成 GPU 纹理,零拷贝)
典型用例静态图片、需像素级操作的图像视频帧、动态内容、高频更新

如何选择实现哪个方法?

需求实现方法理由
静态图片requestImage简单易用,兼容性好
视频/实时渲染requestTexture避免 CPU-GPU 拷贝,性能更高
需要像素操作requestImage可直接访问像素数据
跨平台 GPU 渲染requestTexture统一适配不同图形后端

 Qt 的默认行为

三、示例代码

目录结构:

视频解码类(VideoDecoder)

VideoDecoder.h

#ifndef VIDEODECODER_H
#define VIDEODECODER_H#include <QObject>
#include <QMutex>
#include <opencv2/videoio.hpp>
#include <atomic>class VideoDecoder : public QObject {Q_OBJECT
public:explicit VideoDecoder(QObject *parent = nullptr);~VideoDecoder();public slots:void open(const QString &filePath);void stop();void setPosition(int ms);signals:void frameReceived(const QImage &frame);void durationChanged(int ms);void positionChanged(int ms);private:void decodeLoop();cv::VideoCapture m_cap;std::atomic<bool> m_running{false};std::thread m_decodeThread
http://www.dtcms.com/a/170723.html

相关文章:

  • 58认知干货:创业经验分享及企业形式的汇总
  • 【操作系统】深入理解内存管理:从虚拟内存到OOM Killer
  • 从实列中学习linux shell12 通过Shell脚本来优化MySQL数据库性能,特别是慢SQL跟踪和索引优化
  • Java学习手册:MyBatis 框架作用详解
  • 【LLM】deepseek R1之GRPO训练笔记(持续更新)
  • Axure打开html文件失败,解决方案:
  • Three.js在vue中的使用(二)-动画、材质
  • 微服务框架选型
  • 小白机器人假想:分布式关节控制——机器人运动的未来模式?
  • 数字化时代下,软件测试中的渗透测试是如何保障安全的?
  • C# 方法(返回值、返回语句和void方法)
  • spring cloud 与 cloud alibaba 版本对照表
  • HTML04:图像标签
  • 组合模式(Composite Pattern)
  • 【计算机网络】HTTP中GET和POST的区别是什么?
  • 工业大模型:从设备诊断到工艺重构
  • spring中的@ComponentScan注解详解
  • Oracle VirtualBox 在 macOS 上的详细安装步骤
  • 数据同步实战篇
  • HTTP协议(一)
  • ios systeam introduction
  • 【SimSession】1:将视频发送逻辑与 libuv 事件循环集成是一个典型的并发设计问题
  • Android第三次面试总结之activity和线程池篇(补充)
  • 软件架构之旅(6):浅析ATAM 在软件技术架构评估中的应用
  • Webug4.0通关笔记12- 第17关 文件上传之前端拦截(3种方法)
  • OpenHarmony平台驱动开发(一),ADC
  • 人工智能(AI)未来会产生意识吗?
  • Flink基础整理
  • Python速成系列二
  • React hooks详解