2012-02-21 69 views
3

我正在为iPhone开发视频播放器。我使用ffmpeg库来解码视频帧,我使用opengl 2.0将帧渲染到屏幕上。来自uint8_t缓冲区的CVOpenGLESTextureCacheCreateTextureFromImage

但我的渲染方法是非常缓慢的。

一位用户告诉我: iOS 5包含一种快速执行此操作的新方法。诀窍是使用AVFoundation并将核心视频像素缓冲区直接链接到OpenGL纹理。

我现在的问题是,我的视频播放器发送呈现方法一个uint8_t *类型,然后我用glTexSubImage2D。

但是,如果我想使用CVOpenGLESTextureCacheCreateTextureFromImage我需要一个CVImageBufferRef与框架。

问题是:如何从uint8_t缓冲区创建CVImageBufferRef?

这是我的渲染方法:

- (void) render: (uint8_t*) buffer 

{
的NSLog(@ “渲染”);

[EAGLContext setCurrentContext:context]; 

glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer); 
glViewport(0, 0, backingWidth, backingHeight); 

glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

// OpenGL loads textures lazily so accessing the buffer is deferred until draw; notify 
// the movie player that we're done with the texture after glDrawArrays.   
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, mFrameW, mFrameH, GL_RGB,GL_UNSIGNED_SHORT_5_6_5, buffer); 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

[moviePlayerDelegate bufferDone]; 

glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); 
[context presentRenderbuffer:GL_RENDERBUFFER]; 

}

感谢,

回答

0

我试图做同样的事情。 显然,您需要创建CVPixelBufferRef,并将其替换为CVImageBufferRef。即,首先创建CVPixelBufferRef,如在描述here(下载),然后可以访问像素缓冲区:

CVPixelBufferLockBaseAddress(renderTarget, 0); 
_rawBytesForImage = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); 

(代码不是我的)。

0

有关如何将视频数据直接传递到OpenGL视图的实际工作示例,请参阅我的主题上的blog post。在网上查看一系列“代码段”的问题是,您无法找到适用于iOS的实际完整工作示例。