`
- 浏览:
12918976 次
- 性别:
- 来自:
大连
-
//data指向yuv420p数据- (void)playVideoData:(void *)data{[EAGLContext setCurrentContext:_glContext];if (!_textureY){glGenTextures(1, &_textureY);glGenTextures(1, &_textureU);glGenTextures(1, &_textureV);}glActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_2D, _textureY);glTexImage2D(GL_TEXTURE_2D, 0, GL_RED_EXT, _videoW, _videoH, 0, GL_RED_EXT, GL_UNSIGNED_BYTE, data);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);glActiveTexture(GL_TEXTURE1);glBindTexture(GL_TEXTURE_2D, _textureU);glTexImage2D(GL_TEXTURE_2D, 0, GL_RED_EXT, _videoW/2, _videoH/2, 0, GL_RED_EXT, GL_UNSIGNED_BYTE, data + _videoW
* _videoH);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);glActiveTexture(GL_TEXTURE2);glBindTexture(GL_TEXTURE_2D, _textureV);glTexImage2D(GL_TEXTURE_2D, 0, GL_RED_EXT, _videoW/2, _videoH/2, 0, GL_RED_EXT, GL_UNSIGNED_BYTE, data + _videoW
* _videoH * 5 / 4);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);[self render];}- (void)render{[EAGLContext setCurrentContext:_glContext];glViewport(0, 0, 320, 320);glClearColor(0.0, 0.6, 0.0, 1.0);static c*****t GLfloat squareVertices[] = {-1.0f, -1.0f,1.0f, -1.0f,-1.0f,1.0f,1.0f,1.0f,};static c*****t GLfloat coordVertices[] = {0.0f, 1.0f,1.0f, 1.0f,0.0f,0.0f,1.0f,0.0f,};//GLuint vertices;//glGenBuffers(1, &vertices);//glBindBuffer(GL_ARRAY_BUFFER, vertices);//glBufferData(GL_ARRAY_BUFFER, sizeof(squareVertices), squareVertices, GL_STATIC_DRAW);glClear(GL_COLOR_BUFFER_BIT);glUseProgram(_program);// Update uniform value//glUniform1f(uniforms[UNIFORM_TRANSLATE], 0.0f);GLuint textureUniformY = glGetUniformLocation(_program, "SamplerY");GLuint textureUniformU = glGetUniformLocation(_program, "SamplerU");GLuint textureUniformV = glGetUniformLocation(_program, "SamplerV");// Update attribute valuesglVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);glEnableVertexAttribArray(ATTRIB_VERTEX);glVertexAttribPointer(ATTRIB_TEXTURE, 2, GL_FLOAT, 0, 0, coordVertices);glEnableVertexAttribArray(ATTRIB_TEXTURE);glActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_2D, _textureY);glUniform1i(textureUniformY, 0);glActiveTexture(GL_TEXTURE1);glBindTexture(GL_TEXTURE_2D, _textureU);glUniform1i(textureUniformU, 1);glActiveTexture(GL_TEXTURE2);glBindTexture(GL_TEXTURE_2D, _textureV);glUniform1i(textureUniformV, 2);// DrawglDrawArrays(GL_TRIANGLE_STRIP, 0, 4);//glFlush();[_glContext presentRenderbuffer:GL_RENDERBUFFER];}//Shader.vshattribute vec4 position; // 1//uniform float translate;attribute vec2 TexCoordIn; // Newvarying vec2 TexCoordOut; // Newvoid main(void){gl_Position = position; // 6TexCoordOut = TexCoordIn;}//Shader.fshvarying lowp vec2 TexCoordOut;uniform sampler2D SamplerY;uniform sampler2D SamplerU;uniform sampler2D SamplerV;void main(void){mediump vec3 yuv;lowp vec3 rgb;yuv.x = texture2D(SamplerY, TexCoordOut).r;yuv.y = texture2D(SamplerU, TexCoordOut).r - 0.5;yuv.z = texture2D(SamplerV, TexCoordOut).r - 0.5;rgb = mat3( 1, 1, 1,0, -0.39465,2.03211,1.13983, -0.58060,0) * yuv;gl_FragColor = vec4(rgb, 1);}
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
vs2015 QT opengl 播放yuv文件,视频解码 ,实测正常工作
Windows下使用OpenGL渲染yuv420格式的数据,窗口使用Windows自己创建的窗口句柄
windows中,Qt渲染YUV数据,把yuv_420格式的视频流通过opengl进行实时的显示
零开始学习音视频编程技术(十五) YUV420P转RGB32 在转换的基础加上了Qt显示的界面。实现了Qt播放YUV420P文件 这是Qt的工程,建议使用Qt Creator 打开 Qt的版本是4.8.4,当然是用Qt5也是没有影响的,不过编译器...
Andorid 播放YUVI420/YUV420p流文件,通过OpenGLES渲染播放,压缩文件中包含YUV原始流文件
使用OPENGL实现的YUV播放器,自带H.265解算功能(默认未启动),在VS2017环境下亲测可用,可选择视频分辨率、支持多种格式的显示
本工程包含了使用各种API(Direct3D,OpenGL,GDI,DirectSound,...simplest_video_play_opengl_texture: 使用OpenGL的Texture播放YUV视频像素数据。 simplest_video_play_sdl2: 使用SDL2播放RGB/YUV视频像素数据。
iOS ffmpeg+OpenGL播放yuv+openAL 快放 慢放 视频播放器-附件资源
通过OpenGL纹理读取yuv数据,读取NV21格式、在安卓opengl端做一个普通贴纸教程,可以用照相机、视频编辑器中
Android使用FFmpeg来解码视频,Opengles显示YUV数据的demo
基础QT的OpenGL渲染YUV数据 相关技术请配合文章学习 https://blog.csdn.net/qq_40179458/article/details/106804426
qt使用FFmPeg+SDL2.0+QOpenGLWidget实现的视频播放器,FFmPeg+SDL2.0解码音视频,视频图像解码为YUV420的格式,然后使用QOpenGLWidget进行显示。亲测在windows和Linux下都可使用,附带FFmPeg+SDL2.0第三方库 支持...
用OpenGLES实现yuv420p视频播放界面-附件资源
android使用OpenGLES2.0将YUV数据转为RGB显示. 总共两个资源,实现yuv格式视频显示播放。
本工程包含了使用各种API(Direct3D,...simplest_video_play_opengl_texture: 使用OpenGL的Texture播放YUV视频像素数据。 simplest_video_play_sdl2: 使用SDL2播放RGB/YUV视频像素数据。 1.1版修复了一些问题
使用OPENGL实现YUV播放器功能,内涵H.265格式的解码(未使用),在VS2017环境下亲测可用。
本地测试的视频文件在Bin目录下,实时流采用的是拉取摄像头的RTSP流进行测试。本播放器支持软硬解码,硬解码采用的DXVA2, ffmpeg解码后,通过重写QOpenGLWidget,可以让YUV转RGB在GPU进行处理,减少对CPU的使用。...
采用OpenGLES2.0规范,在GPU硬件上实现高效率的RGB数据到YUV数据的转化