.h文件
继承三个类,两个QT的类,一个回调类,纯虚函数类,提供回调参数接口;
采用OpenGL显示画面,使用shader脚本
#pragma once
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QGLShaderProgram>
#include <mutex>
#include "IVideoCall.h"
extern "C"
{
#include "libavcodec/avcodec.h"//解码
#include "libavutil/avutil.h"//工具
}
#pragma comment(lib,"avutil.lib")//工具库,包含打印错误信息函数
#pragma comment(lib,"avcodec.lib")//解码
class XVideoWidget : public QOpenGLWidget, protected QOpenGLFunctions, public IVideoCall
{
Q_OBJECT
public:
XVideoWidget(QWidget* parent);
~XVideoWidget();
//初始化视频宽高
virtual void Init(int width, int height);//重载的IVideoCall
//重绘,接收frame,不管成功与否都释放frame空间
virtual void Repaint(AVFrame* frame);//重载的IVideoCall
protected:
//重载父类的虚函数
//初始化GL
void initializeGL();
//窗口尺寸变化
void resizeGL(int w, int h);
//刷新显示
void paintGL();
private:
std::mutex mux;
//shader程序
QGLShaderProgram program;
//shader中的yuv变量地址
GLuint unis[3] = {
0 };
//openGL中的texture变量地址
GLuint texs[3] = {
0 };
//材质的内存空间
unsigned char* datas[3] = {
0 };
int width = 240;
int height = 0;
};
.cpp文件
#include "XVideoWidget.h"
#include <QDebug>
#include <QTimer>
#define A_VER 3
#define T_VER 4
FILE* fp = NULL;
//自动双引号
#define GET_STR(x) #x
//顶点shader
const char* vString = GET_STR(
attribute vec4 vertexIn;
attribute vec2 textureIn;
varying vec2 textureOut;
void main(void)
{
gl_Position = vertexIn;
textureOut = textureIn;
}
);
//片元shader
const char* tString = GET_STR(
varying vec2 textureOut;
uniform sampler2D tex_y;
uniform sampler2D tex_u;
uniform sampler2D tex_v;
void