来自uint8_t缓冲区的CVOpenGLESTextureCacheCreateTextureFromImage

时间:2012-02-21 13:05:34

标签: ios5 ffmpeg render opengl-es-2.0 video-processing

我正在为iPhone开发视频播放器。我正在使用ffmpeg库来解码视频帧,而我正在使用opengl 2.0将帧渲染到屏幕上。

但我的渲染方法非常慢。

用户告诉我: iOS 5提供了一种快速执行此操作的新方法。诀窍是使用AVFoundation并将Core Video像素缓冲区直接链接到OpenGL纹理。

我现在的问题是我的视频播放器向render方法发送了一个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];

}

谢谢,

2 个答案:

答案 0 :(得分:0)

我正在尝试做类似的事情。 显然,您需要创建CVPixelBufferRef,并将其替换为CVImageBufferRef。即,您首先创建CVPixelBufferRef,如here所述(下载),然后访问像素缓冲区:

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

(代码不是我的。)

答案 1 :(得分:0)

有关如何将视频数据直接传递到OpenGL视图的实际工作示例,请参阅有关该主题的blog post。查看一系列代码片段的问题"在线,您无法找到iOS的实际完整工作示例。