我目前正在使用OpenGL将我的QTMovie的帧显示到NSOpenGLView中。 为此,我使用以下代码创建纹理上下文:
// Called from a subclass of NSOpenGLView
QTOpenGLTextureContextCreate(kCFAllocatorDefault,
(CGLContextObj)[[self openGLContext] CGLContextObj],
(CGLPixelFormatObj)[[self pixelFormat] CGLPixelFormatObj],
NULL, &_textureContext);
然后我将视觉上下文分配给电影,以便将帧绘制到该上下文中。 我正在用这个位获得实际的框架:
OSStatus status = QTVisualContextCopyImageForTime(_textureContext, kCFAllocatorDefault,
NULL, &_currentFrameTex);
其中_currentFrameTex
是CVOpenGLTextureRef。
所有这一切都适用于一个视图,但我想在第二个视图上绘制相同的帧,我无法想象如何做到这一点。
最简单的方法是什么?当然它也应该是高效的,因为它被称为每秒60次(至少)。
答案 0 :(得分:1)
我建议你在创建NSOpenGLViews时使用上下文共享。
不幸的是,我没有很多使用cocoa(NeXTSTEP)OpenGL窗口系统界面(我使用CGL / AGL)的经验,所以我无法告诉你具体如何做到这一点。但是,initWithFormat:shareContext
的API参考可能会指向正确的方向。
我建议上下文共享的原因是因为您可以在CVOpenGLTextureRef
个实例中重复使用NSOpenGLView
为您提供的纹理句柄。否则,您可能必须获得CVOpenGLTextureRef
每个上下文(视图)。
每个上下文执行此操作的开销可能没有您想象的那么高,Core Video不必通过系统内存复制视频内容来为您提供OpenGL纹理 - 它已经在GPU上有一个表面它可以复制/参考。