6

我有一个 iOS 应用程序,我在其中读取视频AVFoundation并将每个视频帧加载到 OpenGL 纹理中,并以GLKView.

我为每一帧复制视频缓冲区没有问题:

CVPixelBufferRef buffer = [someAVPlayerItemVideoOutput copyPixelBufferForItemTime:itemTime itemTimeForDisplay:nil];

但是当我将视频加载到 openGL 中时,我会根据我使用的方法得到不同的结果。通过观看 Apple 的 WWDC 2011 Session 414 Advances in 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);

这是我用来加载 via 的另一种方式glTexImage2D

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, CVPixelBufferGetBytesPerRow(buffer)/4, CVPixelBufferGetHeight(buffer), 0, GL_RGBA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(buffer));

为什么我使用 会得到奇怪的失真并且没有更好的帧速率CVOpenGLESTextureCacheCreateTextureFromImage()

4

0 回答 0