我正在为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];
}
谢谢,
答案 0 :(得分:0)
我正在尝试做类似的事情。 显然,您需要创建CVPixelBufferRef,并将其替换为CVImageBufferRef。即,您首先创建CVPixelBufferRef,如here所述(下载),然后访问像素缓冲区:
CVPixelBufferLockBaseAddress(renderTarget, 0);
_rawBytesForImage = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget);
(代码不是我的。)
答案 1 :(得分:0)
有关如何将视频数据直接传递到OpenGL视图的实际工作示例,请参阅有关该主题的blog post。查看一系列代码片段的问题"在线,您无法找到iOS的实际完整工作示例。