CVOpenGLESTextureCacheCreateTextureFromImage从uint8_t缓冲区创建纹理

3
我正在开发一个iPhone视频播放器。我正在使用ffmpeg库解码视频帧,并使用opengl 2.0将帧渲染到屏幕上。
但我的渲染方法很慢。
用户告诉我: 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];

感谢您的提问。

谢谢,

2个回答

0

我正在尝试做类似的事情。 显然,您需要创建CVPixelBufferRef,并将其替换为CVImageBufferRef。也就是说,您首先要创建CVPixelBufferRef,如 这里(下载链接),然后获取对像素缓冲区的访问:

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

(代码不是我的)。


0

如果您想查看一个实际的工作示例,展示了如何将视频数据直接传递到OpenGL视图,请参阅我关于此主题的博客文章。在网上查看一系列“代码片段”的问题在于,您无法找到iOS的实际完整工作示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接