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

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

在这先感谢来自文章http://blog.youkuaiyun.com/su_vast/article/details/52214642的作者,使用他的代码我实现了Windows上的YUV数据渲染。但是移植到mac上渲染不出来,经过折腾及对OpenGL的了解,发现问题出在OpenGL版本问题上,不同版本OpenGL的shader编写使用有些不同,资料来源于http://blog.youkuaiyun.com/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
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值