Qt 播放Yuv420p视频

环境:

    vs2015;Qt5.8;opencv3.4;

从文件读取一帧的数据后从yuv转到rgb,用rgb构造一个IplImage,再把IplImage 转成QImage,显示。

yuv420转rgb:

void YUV420_2_RGB(unsigned char* pYUV, unsigned char* pRGB, int width, int height)
{
	//找到Y、U、V在内存中的首地址  
	unsigned char* pY = pYUV;
	unsigned char* pU = pYUV + height*width;
	unsigned char* pV = pU + (height*width / 4);


	unsigned char* pBGR = NULL;
	unsigned char R = 0;
	unsigned char G = 0;
	unsigned char B = 0;
	unsigned char Y = 0;
	unsigned char U = 0;
	unsigned char V = 0;
	double temp = 0;
	for (int i = 0; i < height; i++)
	{
		for (int j = 0; j < width; j++)
		{
			//找到相应的RGB首地址  
			pBGR = pRGB + i*width * 3 + j * 3;

			//取Y、U、V的数据值  
			Y = *(pY + i*width + j);
			U = *pU;
			V = *pV;

			//yuv转rgb公式  
			//yuv转rgb公式  
			temp = Y + ((1.773) * (U - 128));
			B = temp<0 ? 0 : (temp>255 ? 255 : (unsigned char)temp);

			temp = (Y - (0.344) * (U - 128) - (0.714) * (V - 128));
			G = temp<0 ? 0 : (temp>255 ? 255 : (unsigned char)temp);

			temp = (Y + (1.403)*(V - 128));
			R = temp<0 ? 0 : (temp>255 ? 255 : (unsigned char)temp);

			//将转化后的rgb保存在rgb内存中,注意放入的顺序b是最低位  
			*pBGR = B;
			*(pBGR + 1) = G;
			*(pBGR + 2) = R;


			if (j % 2 != 0)
			{
				*pU++;
				*pV++;
			}

		}
		if (i % 2 == 0)
		{
			pU = pU - width / 2;
			pV = pV - width / 2;
		}
	}
}
IplImage 转成QImage:

QImage *IplImageToQImage(const IplImage *img)  
{  
    QImage *image;  
    cvCvtColor(img,img,CV_BGR2RGB);  
    uchar *imgData=(uchar *)img->imageData;  
    image=new QImage(imgData,img->width,img->height,QImage::Format_RGB888);  
    return image;  
}  

参考:

IplImage转QImage: https://blog.csdn.net/gfocean/article/details/6440844

yuv420转RGB:https://blog.csdn.net/rookie_wei/article/details/32909871

项目流程参考:https://blog.csdn.net/leixiaohua1020/article/details/50466201

项目下载:

https://download.csdn.net/download/st_spring/10350563




  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt中,可以使用QOpenGLWidget作为渲染控件,同时使用OpenGL ES 2.0来渲染。下面是渲染YUV420P格式视频的基本步骤: 1. 创建QOpenGLWidget,设置为当前窗口的主窗口。在构造函数中,创建OpenGL上下文,并启用深度测试。 2. 在QOpenGLWidget的resizeGL()函数中,设置视口大小和纵横比。 3. 在QOpenGLWidget的paintGL()函数中,使用OpenGL ES 2.0来渲染YUV420P格式的视频。 4. 在渲染之前,需要将YUV420P格式的数据转换为RGB格式。 5. 创建OpenGL ES 2.0着色器程序。这个着色器程序会将YUV420P格式的数据转换为RGB格式。 6. 创建纹理对象,将RGB格式的数据绑定到纹理上。 7. 渲染纹理。 下面是一个简单的代码示例: ```c++ #include <QtGui/QOpenGLShaderProgram> #include <QtGui/QOpenGLTexture> #include <QtGui/QOpenGLWidget> class YUV420PWidget : public QOpenGLWidget { public: YUV420PWidget(QWidget* parent = nullptr) : QOpenGLWidget(parent) { } void initializeGL() override { initializeOpenGLFunctions(); glEnable(GL_DEPTH_TEST); m_shaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/vertex_shader.glsl"); m_shaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/fragment_shader.glsl"); m_shaderProgram.link(); } void resizeGL(int w, int h) override { glViewport(0, 0, w, h); m_aspectRatio = float(w) / float(h); } void paintGL() override { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // TODO: 转换YUV420P数据为RGB格式 m_shaderProgram.bind(); // TODO: 创建纹理对象并绑定RGB数据 // 渲染纹理 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); m_shaderProgram.release(); } private: QOpenGLShaderProgram m_shaderProgram; QOpenGLTexture* m_texture = nullptr; float m_aspectRatio = 1.0f; }; ``` 其中,vertex_shader.glsl和fragment_shader.glsl分别是OpenGL ES 2.0的顶点着色器和片段着色器。在这两个着色器中,需要将YUV420P格式的数据转换为RGB格式。具体实现可以参考OpenGL ES 2.0的相关教程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值