c++传递视频流到qml 的 VideoOutput

2023-11-18

c++传递视频流到qml 的 VideoOutput

QT官方文档里面介绍的方法 Video Overview

继承QObject,实现属性, 具有可读写videoSurface属性

Q_PROPERTY(QAbstractVideoSurface *videoSurface READ videoSurface WRITE setVideoSurface)

举例:

FrameProvider.h

#ifndef FRAMEPRODER_H
#define FRAMEPRODER_H

#include <QObject>
#include <QAbstractVideoSurface>
#include <QVideoSurfaceFormat>

/*!
 * \brief FrameProvider 作为qml VideoOutput.source
 */
class FrameProvider : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QAbstractVideoSurface *videoSurface READ videoSurface WRITE setVideoSurface)


public:
    FrameProvider();
    ~FrameProvider();
    
    QAbstractVideoSurface *videoSurface() const;
    
	/*!
     * \brief 可设置外部自定义QAbstractVideoSurface
     * \param surface
     */
    void setVideoSurface(QAbstractVideoSurface *surface);

    /*!
     * \brief 设置视频格式
     * \param width     视频宽
     * \param heigth    视频高
     * \param format    enum QVideoFrame::PixelFormat
     */
    void setFormat(int width, int heigth, QVideoFrame::PixelFormat format);

public slots:
    /*!
     * \brief 接收外部数据源,视频帧
     * \param frame
     */
    void onNewVideoContentReceived(const QVideoFrame &frame);

private:
    QAbstractVideoSurface *m_surface = NULL;
    QVideoSurfaceFormat m_format;
};
#endif // FRAMEPRODER_H

FrameProvider.cpp

#include "frameproder.h"


FrameProvider::FrameProvider()
{

}

FrameProvider::~FrameProvider()
{

}

QAbstractVideoSurface *FrameProvider::videoSurface() const {
    return m_surface;
}

void FrameProvider::setVideoSurface(QAbstractVideoSurface *surface)
{
    if (m_surface && m_surface != surface  && m_surface->isActive()) {
        m_surface->stop();
    }

    m_surface = surface;

    if (m_surface && m_format.isValid())
    {
        m_format = m_surface->nearestFormat(m_format);
        m_surface->start(m_format);
    }
}

void FrameProvider::setFormat(int width, int heigth, QVideoFrame::PixelFormat format)
{
    QSize size(width, heigth);
    QVideoSurfaceFormat vsformat(size, format);
    m_format = vsformat;

    if (m_surface)
    {
        if (m_surface->isActive())
        {
            m_surface->stop();
        }
        m_format = m_surface->nearestFormat(m_format);
        m_surface->start(m_format);
    }
}

void FrameProvider::onNewVideoContentReceived(const QVideoFrame &frame)
{
    //按照视频帧设置格式
    setFormat(frame.width(),frame.height(),frame.pixelFormat());
    if (m_surface)
        m_surface->present(frame);
}

main.cpp

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QApplication app(argc, argv);


    QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
    foreach (const QCameraInfo &cameraInfo, cameras) {
        qDebug()<<"name: "<<cameraInfo.deviceName()<<" \n description"<<cameraInfo.description();
    }

    //相机
    QSharedPointer<QCamera> cameraPtr(new QCamera(cameras.at(0)));
    //取景器
    QSharedPointer<MyVideoSurface> surface(new MyVideoSurface);
    cameraPtr.get()->setViewfinder(qobject_cast<MyVideoSurface*>(surface.get()));

    //QWidget 视频输出界面
    //QSharedPointer<VideoOut> videoView(new VideoOut );
    //QObject::connect(surface.get(),&MyVideoSurface::imageChanged,videoView.get(),&VideoOut::onFrameChanged);
    //videoView->setWindowTitle("QWidget Camera");
    //videoView->show();


    //qml 视频输出界面
    QSharedPointer<FrameProvider> provider( new FrameProvider());
    QObject::connect(surface.get(),&MyVideoSurface::frameChanged,provider.get(),&FrameProvider::onNewVideoContentReceived);

    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("_provider",provider.get());

    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);



    cameraPtr->start();

    //simple case
//    QSharedPointer<QCamera> cameraPtr1(new QCamera(cameras.at(1)));
//    QSharedPointer<QCameraViewfinder> viewfinder(new QCameraViewfinder());
//    viewfinder->resize(400,400);
//    cameraPtr1->setViewfinder(viewfinder.get());
//    viewfinder->show();
//    cameraPtr1->start();

    return app.exec();
}

qml

import QtQuick 2.12
import QtQuick.Window 2.12
import QtMultimedia 5.12

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("qml camera")


//    Camera{
//        id:cameraDev
//        imageProcessing.whiteBalanceMode: CameraImageProcessing.WhiteBalanceFlash

//        exposure {
//            exposureCompensation: -1.0
//            exposureMode: Camera.ExposurePortrait
//        }

//        flash.mode: Camera.FlashRedEyeReduction

//    }

    VideoOutput{
        source: _provider //cameraDev
        anchors.fill: parent
        focus : visible
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++传递视频流到qml 的 VideoOutput 的相关文章

  • DirectShow应用——支持Windows Media格式

    大家知道 微软定义了自己的一种媒体文件类型 叫做ASF Advanced Systems Format ASF其实是一个文件 容器 它本身并没有规定音视频的压缩格式 在ASF文件中 我们可以包含任何格式的压缩的 包括MPEG 4 或非压缩的
  • Qt的Script、Quick、QML的关系与总结

    背景 最近在学QML 感觉也不难 就是一直以来接触 Qt 的脚本类的东西的顺序是Script Quick1 Declarative Quick2 QML 那么每一个都是干什么的呢 这些东西搞的我有点混乱 所以决定把他们的大概都先弄清楚 以便
  • 著名的图像检索系统

    1 QBIC Query By Image Content 图像检索系统是 IBM 公司 90年代开发制作的图像和动态景象检索系统 是第一个基于内容的商业化的图像检索系统 QBIC 系统提供了多种的查询方式 包括 利用标准范图 系统自身提供
  • FFmpeg滤镜:制作图片视频流

    iPhone相册有个 为你推荐 功能 它会挑选一些照片形成一个主题 点击后可以像视频一样播放 那么 怎样才能把多张照片转成一个视频文件呢 使用FFmpeg可以这么来做 ffmpeg f image2 framerate 0 5 i D MT
  • 【大前端】android怎么获取本地视频及封面的正确姿势

    话不多说 直接贴核心代码 获取手机中所有视频的信息 private void getAllVideoInfos List
  • DirectShow资源共享

    前段时间为了公司内部培训 写了两个DirectShow的PPT 共享如下 https skydrive live com cid 0E1C9F572B6A2D19 id E1C9F572B6A2D19 211790 另外 我的几本书的源代码
  • Qt开发 之 删除文件或文件夹到回收站(详解)

    文章目录 1 简介 1 1 问题描述 1 2 解决方案 2 源代码 2 1 WinAPI调用 2 2 两行代码解决Release版本根目录驱动问题 2 3 解决部分文件删除不成功的问题 3 QFileInfo官方说明 4 Qt 5 15版本
  • Linux实时调度策略(SCHED_RR)和CFS(SCHED_OTHER)之间的区别

    本文试图从直观角度 说明SCHED RR调度策略和SCHED OTHER调度策略之间的区别 在Linux上 SCHED OTHER和SCHED NORMAL的意思相同 它们都是指的CFS调度策略 只不过 在内核中 CFS定义为SCHED N
  • 音视频同步-时间戳

    媒体内容在播放时 最令人头痛的就是音视频不同步 从技术上来说 解决音视频同步问题的最佳方案就是时间戳 首先选择一个参考时钟 要求参考时钟上的时间是线性递增的 生成数据流时依据参考时钟上的时间给每个数据块都打上时间戳 一般包括开始时间和结束时
  • 深入理解Google Cast(三)探寻原理

    如何开发一个receiver application 先来简单说一下这个话题 Receiver本质就是一个网页 由html CSS和jacascript开发 如果要自定义receiver application 需要在 Google Cas
  • Visual Studio开发Qt5.12.3,使用QChartView widget时报错问题

    Visual Studio开发Qt5 12 3 使用QChartView widget时报错问题 使用场景 在Visual studio2017上开发Qt5 12 3项目 在ui界面上将一个QWidget提升为QChartView作为图标展
  • 技术宅学会几招FFmpeg

    有些时候 我需要对某个视频文件做一些简单的处理 也或者是受亲戚朋友的委托吧 又不好意思推辞 因为人家觉得你是搞技术的 这点小事应该能轻松搞定 但是 我犯不着为这点事去安装一个笨重的多媒体软件 我也不想去网上随便找个免费的小工具 怕它不干净
  • 用FFmpeg制作WebP动图

    去年写过一篇文章 是教大家用FFmpeg制作GIF动画的 今天在讨论到项目中碰到的一个 apng动画素材引起的程序崩溃时 有位同学建议 我们为啥不用WebP来代替 apng 是啊 why not 网上搜到一篇文章 自己试了一下 发现强大的F
  • 15款业界公认的最佳视频处理软件

    因为需要购买昂贵的视频处理软件和高性能图形计算机 所以视频处理是一项比较耗费金钱的技术活 正是由于这样 一部分人选择使用性能较好的免费在线编辑软件 无需太多视频处理知识便可在浏览器中剪切和编辑视频 然而 当我们无法连接网络或网络很慢的时候
  • QML String和数字互相转换

    String 转换成数字 QML代码中 如果遇到字符串转数字 可以使用Number str 将str转换成数字类型 import QtQuick 2 12 import QtQuick Window 2 12 Window visible
  • 软考:中级软件设计师:多媒体基础,音频,图像,颜色,多媒体技术的种类,图像音频视频的容量计算,常见的多媒体标准

    软考 中级软件设计师 多媒体基础 提示 系列被面试官问的问题 我自己当时不会 所以下来自己复盘一下 认真学习和总结 以应对未来更多的可能性 关于互联网大厂的笔试面试 都是需要细心准备的 1 自己的科研经历 科研内容 学习的相关领域知识 要熟
  • 由Qt::BlockingQueuedConnection引起的关闭Qt主页面而后台仍有进程残留

    BUG 由Qt BlockingQueuedConnection引起的关闭Qt主页面而后台仍有进程残留 1 错误代码示例 首先我们看下下面的代码 可以思考一下代码的错误之处 BlockingQueueDeadLock h pragma on
  • DirectShow系列讲座之二——Filter原理

    在上一讲中 笔者介绍了DirectShow的总体系统框架 从这一讲开始 我们要从程序员的角度 进一步深入探讨一下DirectShow的应用以及Filter的开发 在这之前 笔者首先要特别提一下微软提供的一个Filter测试工具 GraphE
  • 多媒体开发计算机颜色相关知识

    颜色模式 颜色模式 颜色模型和颜色空间 计算机中的颜色格式 常用的颜色模型分类 RGB颜色模型 介绍 RGB模型的颜色空间 RGB555 RGB565 RGB24 RGB32 FFMPEG中定义的RGB色彩空间 显示器的颜色空间
  • 【QView】基于QML的UI组件框架 之 AImage (图片)

    先上结果演示 环境 不说版本就是耍流氓 硬件 通用PC 手机 Jetson Xavier NX 套件 均测试有效 系统 Ubuntu 20 04 Android Windows 均测试有效 软件 基于QT6 2 4 Qml 功能描述 AIm

随机推荐

  • 华为机试-HJ1 字符串最后一个单词的长度-C语言、python

    刷题第一步 熟悉输入输出及基本套路 前言 题目描述 C语言 题解1 fgets 题解2 scanf 题解3 gets python 题解1 题解2 参考解析 方法一 使用split 直接返回长度 方法二 逐位遍历找空格 前言 本文主要用于个
  • Docker中成功安装修罗Xiunobbs论坛步骤

    组成 php7 mysql5 7 xiunobbs4 04 nginx 1 Pull镜像 docker pull nginx docker pull docker io centos mysql 57 centos7 docker pull
  • Unity动画机制 Animator与Animator Controller教程

    Chinar blog www chinar xin Unity动画机制 Animator Animation 本文提供全流程 中文翻译 Chinar 的初衷是将一种简单的生活方式带给世人 使有限时间 具备无限可能 Chinar 心分享 心
  • SystemC 官方example 代码的静态分析思路与示例 —— 示例项目:TLM at_1_phase

    一 分析TLM2示例的基本流程方法 1 从sc main 开始 发现各个模块类的内部重要模块 以及对外连接的public端口或socket 理清基本has和is关系 2 看顶层类之成员类的构造函数 理清模块类的端口连接关系 socket是稍
  • Jmeter --- time函数生成时间戳

    一 元件位置 Tools 函数助手对话框 二 生成时间戳 1 未作处理的时间戳 2 除以1000 得到少三位数的时间戳
  • Python基本函数:plot()

    Python画图主要用到 matplotlib 库 而具体来说则是matplotlib下的 pylab 和 pyplot 这两个子库 这两个库可以满足基本的画图需求 下面我们只讨论 pyplot库 具体参数可以参看 官方文档 1 plt p
  • for循环python爬虫_轻松领悟for循环,做一款Python版手账

    https www xin3721 com eschool pythonxin3721 Hello 小数先生粗线啦 今天教大家制作一款Pyhon版手账 先看下手账效果 文中最后有手账代码 Python手账 for in 循环语句 for循环
  • 2-2.vue的实例属性:data

    2 2 vue的实例属性 data data属性的作用 data属性的作用是存储vue实例或组件里面的数值 在vue的实例中它是以一个对象的方式 多个键值对 在组件中它是一个函数 通过函数返回一个对象 data在vue的实例里面使用 1 代
  • 锻炼思维小题目

    第一章 假设法 一个真实的假设往往可以让事实呈现眼前 让真理浮出水面 一个人如果做什么事都可以让其思维以这些假设前提为基础 那么他便能真真正正地活在NLP里而不会陷入困境 他的人生也就会有更大地进步和提升 初级题 1 如何问问题 有甲 乙两
  • 人工智能深度学习Caffe框架介绍,优秀的深度学习架构

    人工智能深度学习Caffe框架介绍 优秀的深度学习架构 在深度学习领域 Caffe框架是人们无法绕过的一座山 这不仅是因为它无论在结构 性能上 还是在代码质量上 都称得上一款十分出色的开源框架 更重要的是 它将深度学习的每一个细节都原原本本
  • 什么是DMA

    什么是DMA 当我们向计算机中加入了一块新的声卡或其它适配卡时 安装程序可能会提醒我们应该选择一个DMA通道 那DMA是什么呢 DMA Direct Memory Access 即直接存储器存取 是一种快速传送数据的机制 数据传递可以从适配
  • const类对象的用法

    寻找了一下网上const类对象的用法 因为之前做oj题目的时候一直报错 Problem D 平面上的点 Point类 VI Time Limit 1 Sec Memory Limit 4 MB Submit 5109 Solved 2254
  • 170810 Python-封装RouterScan的DLL

    1625 5 王子昂 总结 2017年8月10日 连续第312天总结 A RouterScan Python封装 B 在老师的指导下验证了ScanRouter的参数应该是结构体的指针 而不是句柄 那么封装可以通过构造一个相同的结构体传入来完
  • PageHelper+BootStrap+Vue+axios实现分页功能

    PageHelper BootStrap Vue axios实现分页功能 效果展示 技术栈 前端技术 Vue2 5 16 axios BootStrap3 3 7 后端技术 SpringBoot2 7 9 MyBatisPlus3 5 1
  • 数据库的导入

    1 进入到数据库 mysql uroot proot 2 创建数据库 create databases wms 3 进入到指定的数据库 use wms 4 设置数据格式 set names utf8 5 导入数据 source data m
  • Linux查看mysql数据库所在目录

    SQL语句 show global variables like datadir 如图所示 有什么不对的还望指正 书写不易 觉得有帮助就点个赞吧
  • 【算法-LeetCode】63. 不同路径 II(动态规划;滚动数组)

    63 不同路径 II 力扣 LeetCode 文章起笔 2021年11月13日16 28 08 问题描述及示例 一个机器人位于一个 m x n 网格的左上角 起始点在下图中标记为 Start 机器人每次只能向下或者向右移动一步 机器人试图达
  • 数据结构-输出单链表倒数第K个结点值

    问题描述 输入一个单向链表 输出该链表中倒数第k个结点 链表的最后一个结点是倒数第1个节点 输入形式 输入第一位为K值 其后接一串以空格分隔的整型值 输入 1时停止建立链表 输出形式 输出为倒数第K个结点的值 若无 则输出Not Found
  • 大数据分析Python中Scikit-learn机器学习库

    Scikit learn是一个免费的Python机器学习库 它具有多种算法 例如支持向量机 随机森林和k邻域 并且还支持Python数值和科学库 例如NumPy和SciPy 在大数据分析Python中Scikit learn机器学习库中 我
  • c++传递视频流到qml 的 VideoOutput

    c 传递视频流到qml 的 VideoOutput QT官方文档里面介绍的方法 Video Overview 继承QObject 实现属性 具有可读写videoSurface属性 Q PROPERTY QAbstractVideoSurfa