Gin*_*ane 6 video opengl-es avfoundation ios opengl-es-2.0
我有一个iOS应用程序,我正在从中读取视频AVFoundation并将每个视频帧加载到OpenGL纹理中并在屏幕上显示GLKView.
我没有问题为每个帧复制视频缓冲区:
CVPixelBufferRef buffer = [someAVPlayerItemVideoOutput copyPixelBufferForItemTime:itemTime itemTimeForDisplay:nil];
Run Code Online (Sandbox Code Playgroud)
但是当我将视频加载到openGL中时,我会得到不同的结果,具体取决于我使用的方法.我从观看Apple的WWDC 2011 Session 414 OpenGL视频的进展中得到的理解是,新CVOpenGLESTextureCacheCreateTextureFromImage功能应该比仅通过读取像素缓冲区更快glTexImage2D.但是,当使用具有大量计算的着色器程序时,无论使用哪种方法,我都会获得相同的帧速率.而且,CVOpenGLESTextureCacheCreateTextureFromImage实际上是给我一个奇怪的"块状"失真,而glTexImage2D不是.失真似乎好像屏幕上的随机块不会使用最新帧更新.
这是我用于使用方法创建纹理的代码CVOpenGLESTexture:
CVOpenGLESTextureRef videoFrameTexture = NULL;
CVPixelBufferLockBaseAddress(buffer, 0);
CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, videoTextureCache, buffer, NULL, GL_TEXTURE_2D, GL_RGBA, CVPixelBufferGetWidth(buffer), CVPixelBufferGetHeight(buffer), GL_BGRA, GL_UNSIGNED_BYTE, 0, &videoTexture);
glBindTexture(GL_TEXTURE_2D, CVOpenGLESTextureGetName(videoFrameTexture));
CVBufferRelease(buffer);
CFRelease(videoFrameTexture);
Run Code Online (Sandbox Code Playgroud)
以下是我用来加载via的替代方法glTexImage2D:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, CVPixelBufferGetBytesPerRow(buffer)/4, CVPixelBufferGetHeight(buffer), 0, GL_RGBA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(buffer));
Run Code Online (Sandbox Code Playgroud)
为什么我会使用奇怪的失真和没有更好的帧速率CVOpenGLESTextureCacheCreateTextureFromImage()?
| 归档时间: |
|
| 查看次数: |
2153 次 |
| 最近记录: |