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

2022-10-26 Qt6.5版本后视频渲染

文章目录

  • 前言
  • 一、先上代码
    • 1.将yuv/nv12等解码后的视频数据放入QVideoSink内
    • 2.将AVFrame数据保存进QVideoSink
    • 3.在qml中的显示
    • 4.同理,在widget中也可显示
  • 二、QVideoFarme支持的格式
  • 三、说说渲染效率问题


前言

Qt 6版本中,视频播放能力得到了质的飞越,相对于qt5,变化也很多,具体变化可以看官方说明 https://www.qt.io/blog/qt-multimedia-in-qt-6

在Qt5版本中,如果需要播放一个视频,由于后端的解码能力很弱,绝大多数需要写解码的代码,但是在Qt6中,后端加入了ffmpeg,解码已经不是我们所需解决的问题,Qt Multimedia 可以很好的去播放视频
但是,在项目中大家可能不止会播放本地视频,很多情况下需要播放在线视频,比较低延时的rtsp流,udp裸流等等。对于需要实时性高的同学来说,qt的后端能力还是没有做好。这时还是需要自己处理视频流。

在Qt5时代,要播放一个低延时视频流,通常是使用ffmpeg自己解封装,解码视频流后,再将yuv/nv12等视频数据交给qt去渲染,问题是qt渲染能力低,很早大家使用sdl等工具去渲染视频,但由于sdl和qt各自使用自己的渲染事件,常会导致闪烁等问题,后来开始使用opengl,手写shader自己处理yuv数据,这个方案确实可行,效率也很高,但是得学习opengl相关知识。

但到了Qt6,新的QVideoSink,完全具备各视频的渲染,yuv,nv12等常见格式一点都不在话下,而且支持多种渲染方式,比如opengl和d3d11,d3d9等等,它主要是使用了Qt6的QRHI技术,有兴趣的同学可以去了解了解。

我这里主要讲讲如何使用ffmpeg解码+QVideoSink进行视频渲染播放


一、先上代码

1.将yuv/nv12等解码后的视频数据放入QVideoSink内

class VideoSourceRenderer : public QObject
{Q_OBJECTQ_PROPERTY(QVideoSink* videoSink READ videoSink WRITE setVideoSink NOTIFY videoSinkChanged)public:VideoSourceRenderer(){}QVideoSink* videoSink() const{return m_videoSink.get();}void  setVideoSink(QVideoSink* videoSink){if (m_videoSink == videoSink)return;m_videoSink = videoSink;emit videoSinkChanged();}signals:void videoSinkChanged();

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Go 初始化一个字典value是列表
  • 前端/python脚本/转换-使用天地图下载的geojson(echarts4+如果直接使用会导致坐标和其他信息不全)
  • MongoDB - 查询操作符:比较查询、逻辑查询、元素查询、数组查询
  • 安全防御----防火墙综合实验2
  • 图论---匈牙利算法求二分图最大匹配的实现
  • pdf只要前几页,pdf中只要前几页怎么处理
  • pytorch-pytorch之LSTM
  • DockerCompose介绍,安装,使用
  • 【错题集-编程题】四个选项(DFS + 剪枝 + 哈希表)
  • 利用 AI 解放双手:把“贾维斯”带进现实 | 开源专题 No.64
  • 拥抱UniHttp,规范Http接口对接之旅
  • 基于JavaSpringBoot+Vue+uniapp微信小程序校园宿舍管理系统设计与实现
  • wxml与标准的html的异同
  • NLP任务:情感分析、看图说话
  • 防御第二次作业完成接口配置实验
  • 「面试题」如何实现一个圣杯布局?
  • centos安装java运行环境jdk+tomcat
  • MaxCompute访问TableStore(OTS) 数据
  • Python socket服务器端、客户端传送信息
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • 闭包--闭包作用之保存(一)
  • 技术发展面试
  • 聚类分析——Kmeans
  • 前端性能优化——回流与重绘
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 日剧·日综资源集合(建议收藏)
  • 如何在GitHub上创建个人博客
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 详解移动APP与web APP的区别
  • 一些css基础学习笔记
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 用Canvas画一棵二叉树
  • 湖北分布式智能数据采集方法有哪些?
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​如何在iOS手机上查看应用日志
  • ​油烟净化器电源安全,保障健康餐饮生活
  • # Panda3d 碰撞检测系统介绍
  • #define与typedef区别
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (31)对象的克隆
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (转)iOS字体
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .net core + vue 搭建前后端分离的框架
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .net SqlSugarHelper
  • .NET 反射 Reflect
  • .NET分布式缓存Memcached从入门到实战
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET命名规范和开发约定