最近利用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
#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