qt+opengl 播放yuv视频

一、实现效果

二、pro文件

Qt += widgets opengl

三、主要代码

#include "glwidget.h"GLWidget::GLWidget(QWidget *parent) : QOpenGLWidget(parent)
{connect(&m_timer, &QTimer::timeout, this,[&](){this->update();});m_timer.start(1000/33);
}void GLWidget::initializeGL()
{qDebug() << "初始化";initializeOpenGLFunctions();    // 初始化openglqDebug() << "加载片元脚本:" <<program.addShaderFromSourceFile(QGLShader::Vertex, ":/res/shader.vert");  // 片元qDebug() << "加载顶点脚本:" <<program.addShaderFromSourceFile(QGLShader::Fragment, ":/res/shader.frag");    // 顶点qDebug() << "编译shader:" << program.link();qDebug() << "绑定shader:" << program.bind();int A_VER = -1;int T_VER = -1;// 设置顶点坐标的变量A_VER = program.attributeLocation("vertexIn");//, A_VER// 设置材质坐标T_VER = program.attributeLocation("textureIn");//, T_VERstatic const GLfloat ver[] = {-1.0f, -1.0f,   0.0f, 1.0f,//0.0f, 0.0f,1.0f, -1.0f,    1.0f, 1.0f,//1.0f, 0.0f,-1.0f, 1.0f,    0.0f, 0.0f,//0.0f, 1.0f,1.0f, 1.0f,     1.0f, 0.0f//1.0f, 1.0f};glGenVertexArrays(1, &m_vao);glBindVertexArray(m_vao);glGenBuffers(1, &m_vbo);glBindBuffer(GL_ARRAY_BUFFER, m_vbo);glBufferData(GL_ARRAY_BUFFER, sizeof(ver), ver, GL_STATIC_DRAW);glVertexAttribPointer(A_VER, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);glEnableVertexAttribArray(A_VER);glVertexAttribPointer(T_VER, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2* sizeof(float)));glEnableVertexAttribArray(T_VER);glBindVertexArray(0);glBindBuffer(GL_ARRAY_BUFFER, 0);// 从shader获取材质unis[0] = program.uniformLocation("tex_y");unis[1] = program.uniformLocation("tex_u");unis[2] = program.uniformLocation("tex_v");// 创建材质glGenTextures(3, texs);// YglBindTexture(GL_TEXTURE_2D, texs[0]);   // 绑定材质glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);  // 设置纹理参数,放大过滤,线性插值 GL_NEAREST(效率高,效果差)glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, 0);   // 创建材质显卡空间//  UglBindTexture(GL_TEXTURE_2D, texs[1]);   // 绑定材质glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);  // 设置纹理参数,放大过滤,线性插值glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width / 2, height/ 2, 0, GL_RED, GL_UNSIGNED_BYTE, 0);   // 创建材质显卡空间// 创建材质 VglBindTexture(GL_TEXTURE_2D, texs[2]);   // 绑定材质glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);  // 设置纹理参数,放大过滤,线性插值glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width / 2, height / 2, 0, GL_RED, GL_UNSIGNED_BYTE, 0);   // 创建材质显卡空间m_file.setFileName(":/res/1.yuv");if(!m_file.open(QIODevice::ReadOnly)){qDebug() << "打开失败!";return;}}void GLWidget::paintGL()
{glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区program.bind();//qDebug() << "绘制";if(m_file.atEnd()){m_file.seek(0);}QByteArray buf;buf = m_file.read(width * height);glBindVertexArray(m_vao);glActiveTexture(GL_TEXTURE0);   // 激活第0层glBindTexture(GL_TEXTURE_2D, texs[0]);  // 0层绑定到y材质中// 修改材质内容(复制内存内容)glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RED, GL_UNSIGNED_BYTE, buf.data());glUniform1i(unis[0], 0);   // 与shader的uni变量关联buf = m_file.read(width * height / 4);glActiveTexture(GL_TEXTURE0 + 1);   // 激活第1层glBindTexture(GL_TEXTURE_2D, texs[1]);  // 1层绑定到U材质中// 修改材质内容(复制内存内容)glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width / 2, height / 2, GL_RED, GL_UNSIGNED_BYTE, buf.data());glUniform1i(unis[1], 1);   // 与shader的uni变量关联buf = m_file.read(width * height / 4);glActiveTexture(GL_TEXTURE0 + 2);   // 激活第2层  VglBindTexture(GL_TEXTURE_2D, texs[2]);  // 2层绑定到v材质中// 修改材质内容(复制内存内容)glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width / 2, height / 2, GL_RED, GL_UNSIGNED_BYTE, buf.data());glUniform1i(unis[2], 2);   // 与shader的uni变量关联glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);  // 开始绘制glBindVertexArray(0);
}void GLWidget::resizeGL(int w, int h)
{//qDebug() << w <<" " << h;glViewport(0, 0, w, h);
}

完整demo下载:点击跳转

觉得有帮助的话,打赏一下呗。。

           

需要商务合作(定制程序)的欢迎私信!! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/898105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android开源库——RxJava和RxAndroid

RxJava和RxAndroid是什么&#xff1f; RxJava是基于JVM的响应式扩展&#xff0c;用于编写异步代码 RxAndroid是关于Android的RxJava绑定 RxJava和RxAndroid使用 依赖 implementation io.reactivex.rxjava3:rxjava:3.1.0 implementation io.reactivex.rxjava3:rxandroid:3.…

并发基础—三大问题:可见性、原子性、有序性

文章目录 可见性原子性有序性&#xff08;指令重排&#xff09;经典的指令重排案例&#xff1a;单例模式的双重检查锁volatile和synchronize都可以保证有序性并发压测工具Jcstress证明指令重排会在多线程下出现问题&#xff08;了解&#xff09;CPU缓存分为三个级别&#xff1a…

PyTorch 入门学习

目录 PyTorch 定义 核心作用 应用场景 Pytorch 基本语法 1. 张量的创建 2. 张量的类型转换 3. 张量数值计算 4. 张量运算函数 5. 张量索引操作 6. 张量形状操作 7. 张量拼接操作 8. 自动微分模块 9. 案例-线性回归案例 PyTorch 定义 PyTorch 是一个基于 Python 深…

Hive SQL 精进系列:REGEXP_REPLACE 函数的用法

目录 一、引言二、REGEXP_REPLACE 函数基础2.1 基本语法参数详解2.2 简单示例 三、REGEXP_REPLACE 函数的应用场景3.1 去除特殊字符3.2 统一字符串格式 四、REGEXP_REPLACE 与 REPLACE 函数的对比4.1 功能差异4.2 适用场景 五、REGEXP_REPLACE 与 REGEXP 函数的对比5.1 功能差异…

从0开始搭建微服务架构特别篇SpringCloud网关聚合knife4j

前言&#xff1a;总所周知项目开发接口测试需要knife4j&#xff0c;但是&#xff0c;微服务架构中微服务很多&#xff0c;模块地址很多&#xff0c;需要统一管理api测试&#xff0c;就需要聚合在网关统一调用&#xff0c;本章&#xff0c;就说明如何通过网关聚合使用knife4j。 …

Spring Cloud 中的服务注册与发现: Eureka详解

1. 背景 1.1 问题描述 我们如果通过 RestTamplate 进行远程调用时&#xff0c;URL 是写死的&#xff0c;例如&#xff1a; String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 当机器更换或者新增机器时&#xff0c;这个 URL 就需要相应地变…

网页制作15-Javascipt时间特效の记录网页停留时间

01效果图&#xff1a; 02运用&#xff1a; window.setTimeout&#xff08;&#xff09;刷新function&#xff08;&#xff09;函数document.forms&#xff08;&#xff09;&#xff1a;表单if条件语句window.alert&#xff08;&#xff09;窗口警示 03、操作代码&#xff1a;…

【Rust基础】排序和分组

排序 简单排序 整数排序 #[test] fn test_sort(){let mut list vec![1, 5, 3, 2, 4];list.sort(); //✔assert_eq!(list, vec![1, 2, 3, 4, 5]); }小数排序 #[test] fn test_sort(){let mut list vec![1, 5, 3, 2, 4];//❌ 不能直接使用sort&#xff0c;因为f32和f64未实现O…

C++ std::list超详细指南:基础实践(手搓list)

目录 一.核心特性 1.双向循环链表结构 2.头文件&#xff1a;#include 3.时间复杂度 4.内存特性 二.构造函数 三.list iterator的使用 1.学习list iterator之前我们要知道iterator的区分 ​编辑 2.begin()end() 3.rbegin()rend() 四.list关键接口 1.empty() 2. size…

996引擎 - 红点系统

996引擎 - 红点系统 总结NPC 红点(TXT红点)Lua 红点1. Red_Point.lua2. UI_Ex.lua参考资料以下内容是在三端 lua 环境下测试的 总结 红点系统分几个部分组成。 M2中设置变量推送。 配置红点表。 Envir\Data\cfg_redpoint.xls 2.1. UI元素中找到ID填写 ids 列。 主界面挂载…

C语言——变量与常量

C语言中的变量与常量&#xff1a;简洁易懂的指南 在C语言编程中&#xff0c;变量和常量是最基本的概念之一。理解它们的区别和使用方法对于编写高效、可维护的代码至关重要。本文将详细介绍C语言中的变量和常量&#xff0c;并通过图表和代码示例帮助你更好地理解。 目录 什么…

PySide(PyQt),使用types.MethodType动态定义事件

以PySide(PyQt)的图片项为例&#xff0c;比如一个视窗的场景底图是一个QGraphicsPixmapItem&#xff0c;需要修改它的鼠标滚轮事件&#xff0c;以实现鼠标滚轮缩放显示的功能。为了达到这个目的&#xff0c;可以重新定义一个QGraphicsPixmapItem类&#xff0c;并重写它的wheelE…

K8S学习之基础三十一:k8s中RBAC 的核心概念

Kubernetes (k8s) 中的 RBAC&#xff08;Role-Based Access Control&#xff0c;基于角色的访问控制&#xff09;是一种用于管理用户和服务账户对集群资源访问权限的机制。RBAC 允许管理员通过定义角色&#xff08;Role&#xff09;和角色绑定&#xff08;RoleBinding&#xff…

【eNSP实战】三层交换机使用ACL实现网络安全

拓图 要求&#xff1a; vlan1可以访问Internetvlan2和vlan3不能访问Internet和vlan1vlan2和vlan3之间可以互相访问PC配置如图所示&#xff0c;这里不展示 LSW1接口vlan配置 vlan batch 10 20 30 # interface Vlanif1ip address 192.168.40.2 255.255.255.0 # interface Vla…

软考系统架构师 — 1 考点分析

目录 1 考点总结 1 考点总结 章节 内容 真题考察 绪论 1. 绪论 不考 计算机相关知识 2. 计算机系统基础知识&#xff0c;新增计算机硬件、嵌入式、计算机语言、系统工程 对应计算机组成结构、操作系统、数据库、计算机网络、多媒体等知识点&#xff0c;整体分值在 10 …

在Eclipse 中使用 MyBatis 进行开发,通常需要以下步骤:

在Eclipse 中使用 MyBatis 进行开发&#xff0c;通常需要以下步骤&#xff1a; 1. 创建 Maven 项目 首先&#xff0c;在 Eclipse 中创建一个 Maven 项目。如果你还没有安装 Maven 插件&#xff0c;可以通过 Eclipse Marketplace 安装 Maven 插件。 打开 Eclipse&#xff0c;选…

错误记录: git 无法连接到github

错误记录: git 无法连接到github 今天, 新建了一个github仓库, 但从本地怎么都push不上去.并报错 gitgithub.com: Permission denied (publickey). fatal: Could not read from remote repository.Please make sure you have the correct access rights and the repository e…

k8s 配置两个deployment主机级别互斥部署

在 Kubernetes 中&#xff0c;要实现两个 Deployment 的 Pod 在主机级别互斥部署&#xff0c;可以使用 podAntiAffinity 配置。通过设置 podAntiAffinity&#xff0c;可以确保两个 Deployment 的 Pod 不会被调度到同一节点上。 实现步骤 定义 Deployment&#xff1a; 为每个…

Unity中WolrdSpace下的UI展示在上层

一、问题描述 Unity 中 Canvas使用World Space布局的UI&#xff0c;想让它不被3d物体遮挡&#xff0c;始终显示在上层。 二、解决方案 使用shader解决 在 UI 的材质中禁用深度测试&#xff08;ZTest&#xff09;&#xff0c;强制 UI 始终渲染在最上层。 Shader "Custo…

五子棋小游戏-简单开发版

一、需求分析 开发一个基于 Pygame 库的五子棋小游戏&#xff0c;允许两名玩家在棋盘上轮流落子&#xff0c;当有一方达成五子连珠时游戏结束&#xff0c;显示获胜信息&#xff0c;并提供退出游戏和重新开始游戏的操作选项。 1.棋盘显示 &#xff1a; 显示一个 15x15 的五子棋…