视频流播放器类的实现(难)【5】

.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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值