利用Qt + OpenGL 渲染 YUV数据,播放视频 mac版

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

最近利用Qt渲染YUV数据,折腾了很久,最开始使用FFmpeg将YUV数据转换成RGB数据后在用qt绘制,很快得到了成功,但是cpu占用率太大,最后放弃了。

在这先感谢来自文章http://blog.csdn.net/su_vast/article/details/52214642的作者,使用他的代码我实现了Windows上的YUV数据渲染。但是移植到mac上渲染不出来,经过折腾及对OpenGL的了解,发现问题出在OpenGL版本问题上,不同版本OpenGL的shader编写使用有些不同,资料来源于http://blog.csdn.net/ym19860303/article/details/44115135。


下面是我写的代码,有什么不完善的地方请读者反馈,相互学习。

renderview.h

#ifndef RENDERVIEW_H
#define RENDERVIEW_H

#include <QWidget>
#include <QOpenGLWidget>
#include <QGLContext>
#include <QGLWidget>
#include <QOpenGLTexture>
#include "global.h"

class RenderView : public QOpenGLWidget
{
    Q_OBJECT

public:
    RenderView(QWidget* parent = 0);
    ~RenderView();

    void Render(unsigned char* buffer,int w, int h);
protected:
    //virtual void paintEvent(QPaintEvent *event);
    virtual void initializeGL();
    virtual void resizeGL( int w, int h );
    virtual void paintGL();
    
    
private:
    GLuint prepareShaderProgram();
    
private:
    GLuint m_shader;
    GLuint m_vertexBuffer;
    GLuint textureUniformY;
    GLuint textureUniformU;
    GLuint textureUniformV;
    GLuint vertexBuffer;
    GLuint vertextAttribute;
    GLuint textureAttribute;
    
    GLuint id_y;
    GLuint id_u;
    GLuint id_v;
    
    int m_nVideoW;
    int m_nVideoH;
    int m_nViewW;
    int m_nViewH;
    unsigned char* m_pBufYuv420p;
    unsigned char* m_pBuffer;
    bool m_bStartPlay;
};

#endif // RENDERVIEW_H


renderview.cpp


#include "renderview.h"
#include <QPainter>
#include <QSurfaceFormat>
#include <QMutex>
#include <QDebug>
#include <QSurfaceFormat>
#include "DecoderCtrl/MainConcept.h"

#define BUFFER_MAX_SIZE 1920*1080+1024


const char *vsrc =
"#version 410\n"
"in vec4 vertexIn;\n"
"in vec2 textureIn;\n"
"out vec2 textureOut;\n"
"void main(void)\n"
"{\n"
"    gl_Position = vertexIn;\n"
"    
使用OpenGLopengl ES 渲染YUV图片文件的QT示例 头文件:CPlayWidget.hcpp文件:CPlayWidget.cpp默认打开 ./test.yuv文件。 阅读详情

相关推荐

FFMpeg-3、基于QT实现音视频播放显示

为什么要采用QTOpenGL三维的来绘制,直接使用QopenWidget、QWight也是可以的,但是如果使用后面的那么其实图像显示和界面的按钮是一套东西,当点击按钮刷新的时候就会存在闪屏的情况。因为视频显示存在像素格式的转换问题,要从解码出来的YUV格式转化为显示需要的RGB格式,视频的每一帧图像这么多像素点都需要转换,这是一个很大的开销,如果这一部分效率不高,那么对整体的视频播放性能都是十分有影响的,而QTopenGL也是效率很高的,直接操作显卡。后台缓冲表面和前台表面的概念总是同时出现的。

yinshipin007的博客 2694

OpenGL-实现视频播放(FFMpeg)

课程采用FFMpeg作视频解码,采用OpenGL实现视频渲染,从RGB数据的绘制,到直接渲染YUV数据,实现三路YUV数据单纹理的输入,提升系统性能,接着采用PBO方式优化内存到显存的传输,实现DMA传输,解放CPU,将解码和渲染分离到不同的线程中,极大的提升了系统的性能。后介绍视频特效的实现。

OpenGL/OpenGL ES入门:渲染YUV数据实践

1.yuv的字节数 现有宽为w高为h的一个视频,现在定义了一个data[] bytes变量并存储了这个视频的一帧数据。 bytes数组中,先连续存储每个像素的灰度信息,y通道占w*h个字节; 然后顺序存储颜色数据,u和v分别占一个字节,每个颜色数据共占2个字节,所以uv通道占(w/2)(h/2)2=w*h/2个字。 2.纹理 2.1 纹理的组成 y通道的数据生成一个opengl纹理; uv通道的数据生成一个opengl纹理; 两个纹理作为渲染时的输入,在渲染过程中由GPU组装还原出来视频画面。

qq_34754747的博客 5334

【开源项目】QT OPENGL 与 shader 绘制展示视频代码实例 OPenGL直接显示YUV数据

XvideoWidget.h #pragma once #include <QOpenGLWidget> #include<QOpenGLFunctions> #include<QGLShaderProgram> class XvideoWidget : public QOpenGLWidget,protected QOpenGLFunctions { Q_OBJECT public: XvideoWidget(QWidget *parent); ~Xvi

用可见的方式来记录和分享每一次收获 1479

从零实现 Qt + FFmpeg 本地视频播放

本文介绍了基于Qt 6和FFmpeg 8.1开发的本地视频播放器项目,实现了音视频解码、画面渲染、音频输出、播放控制及同步等功能。项目采用Qt Widgets构建界面,利用FFmpeg处理媒体解封装、解码和格式转换,通过QAudioSink输出音频信号。关键实现包括:工程内置FFmpeg的CMake配置、播放线程与界面的信号槽通信、音视频同步机制(以音频时钟为主时钟),以及支持Seek的进度控制。该项目适合作为Qt+FFmpeg播放器开发的入门参考,代码已开源在GitHub。

hanpengye的博客 330

长沙红胖子Qt·西安(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中...

长沙红胖子 Qt・西安,本人拥有省级科研团队从业背景,研发团队产出所有项目、产品方案和研发无分包、无外包、无AI代笔,长期深耕双一流体系高精尖技术配套研发。博客主动剥离复杂底层工况机理,专注沉淀高端、特种行业领域Qt工程化落地实战经验。所有内容均为个人梳理总结的通用性工程方法论,只输出可公开的普适技术思路。

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 163万+

i.MX31嵌入式多媒体处理器:ARM11核心与IPU/GPU硬件加速架构解析

在嵌入式系统开发中,异构计算架构通过集成专用硬件加速单元来提升特定任务的处理效率,是实现高性能、低功耗设计的关键原理。这种技术方案的核心价值在于将计算密集型任务(如视频编解码、图形渲染)从通用处理器(CPU)卸载至专用硬件,从而显著降低系统功耗并提升实时性。其典型应用场景包括便携式媒体播放器、移动互联网设备和工业控制界面等对多媒体处理能力有较高要求的领域。本文以飞思卡尔i.MX31处理器为例,深入剖析其ARM1136JF-S核心与图像处理单元(IPU)、图形处理单元(GPU)协同工作的机制。该芯片的IPU模

weixin_34221775的博客 372

视频技术开发周刊 | 251

每周一期,纵览音视频技术领域的干货。新闻投稿:contribute@livevideostack.com。为什么OpenCV计算的帧率是错误的?我们在对线上的直播流数据进行某些检测时,忽然有一天,我们发现平台开始大面积的超时,让我们来看看这到底是怎么回事?RealNetworks vs. 微软:早期流媒体行业之争2015年是流媒体行业出现的第20年,对于很多不熟悉互联网早...

LiveVideoStack 939

OBS Studio:开源流媒体软件的架构解析与技术实现

OBS Studio(Open Broadcaster Software)作为一款免费开源的视频录制与直播推流软件,在流媒体技术领域占据着重要地位。这款跨平台的软件不仅支持Windows、macOS和Linux系统,还提供了完整的视频采集、混音、编码和推流功能,为内容创作者、游戏主播和企业用户提供了专业级的流媒体解决方案。 ## 项目概述与价值主张 OBS Studio的核心价值在于其模块化设

gitblog_00795的博客 759

异构多核SoC架构解析:TDA2E-17如何实现嵌入式视觉系统的高效协同

在嵌入式系统开发中,异构计算架构通过集成不同指令集和功能定位的处理核心,如通用CPU、DSP和实时微控制器,实现了任务的专业化分工与并行处理。其核心原理在于利用硬件加速单元卸载特定计算负载,并通过高效的内存子系统与DMA控制器保障数据流畅通。这种架构的技术价值在于显著提升系统整体性能与能效比,尤其适用于对算力、实时性和功耗有严苛要求的场景,例如高级驾驶辅助系统(ADAS)和工业机器视觉。以德州仪器TDA2E-17为例,其集成的Cortex-A15、C66x DSP和Cortex-M4核心,配合POWERVR

weixin_33796205的博客 443

QOpenGLWidget渲染多路yuv,低cpu消耗,解决画面撕裂

QOpenGLWidget渲染多路yuv,低cpu消耗,解决画面撕裂

m0_46597409的博客 4776

Opengl 渲染YUYV(YUV422)图像

Opengl 渲染YUYV(YUV422)图像 //YUYV数据格式: 1个Y代表一个像素,YUYV代表2个像素,4字节,[所以2字节/每像素] //w=width //图片宽度 //h=high //图片高度 //p=wh //图片像素总数 //c=p2 //数组总长度 //d=(w*h)/2 //一半像素 ———————————————— 权声明:本文为CSDN博主「科技ing」的原创文章,遵循CC 4.0 BY-SA权协议,转载请附上原文出处链接及本声明。 原文链接:h

TuringEvo专栏 2994

海思Hi3536使用QOpenGLWidget预览yuv420sp视频

参考文章: 《ffmpeg opengl 硬解视频使用openglqt中显示nv12》 《qt 使用opengl显示yuv实时视频流》 上述参考文章中《qt 使用opengl显示yuv实时视频流》主要是介绍yuv420p存储方式的openGL渲染,Hi3536可以利用vi_dump/vpss_chn_dump工具dump...

mkelehk的专栏 3133

QT 使用ffmpeg+QOpenGLWidget进行图像渲染

采用OpenGL渲染图像,相比传统的QImage效率着实要高很多。1、包含必须的头文件。

老狼的专栏 1357

基于libVLC的视频播放器之十一:VLC-Qt抽取YUV帧,并用QOpenGLWidget渲染显示

直接传winID的方式就不介绍了,VLC-Qt自带的demo(SimplePlayer)使用的就是这种方式 本文在SimplePlayer的基础上修改,这里抽帧后(YUV格式),使用QOpenGLWidget渲染,并在图像上画一个正方形,放置一个半透明按钮 一.效果 二.原理 VLC-Qt中处理视频时需要的几个类: VlcMedia(标识一个可播放的媒体,可以设置配置参数) VlcMediaPlayer(控制播放) VlcVideoStream(视频抽帧) VlcWidgetVideo(显示视频的控

草上爬的博客 5237

基于FFmpeg的视频播放器之六:使用QOpenGLWidget渲染yuv420p

一.GLSL Versions Intro You can use the#versioncommand as the first line of your shader to specify GLSL version: #version 120 void main() { gl_FragColor = vec4(1.0); } GLSL versions are released alongside GL versions. See the following charts to...

草上爬的博客 3997

从零实现简易播放器-2.opengl渲染yuv图像

opengl渲染yuv图像 作者:史正 邮箱:shizheng163@126.com 如有错误还请及时指正 如果有错误的描述给您带来不便还请见谅 如需交流请发送邮件,欢迎联系 我的csdn : https://blog.csdn.net/shizheng163 我的github : https://github.com/shizheng163 文章目录opengl渲染yuv图像简述使...

shizheng163的博客 2097

OpenGL 渲染 YUYV(YUV422)

OpenGL渲染YUYV(YUV422)

PX1525813502的博客 6121

qt5_qml_Opengl_shader 第三弹-----------------------纹理贴图(YUV

Opengl_under_qml第三弹----------------------纹理贴图(YUV) 本文接上文 Opengl_under_qml第三弹----------------------纹理贴图(YUV) 主要通过程序将yuv数据送给shader,通过gpu来转成rgb进而渲染。   与上文主要不同的地方还是paint函数,为了容易看懂,没有将其写成多个函数的形式,也没有加测试

u010423298的专栏 3465
上一篇: 手工将python程序发布为exe执行程序
下一篇: 解决qt5上qt.network.ssl: QSslSocket: cannot call unresolved function TLSv1_1_client_method 问题
jake2012
博客等级 码龄17年 32粉丝 25原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值