0

我目前正在使用 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);

_currentFrameTexCVOpenGLTextureRef在哪里。

所有这一切都适用于一个视图,但我想在第二个视图上绘制相同的框架,我无法想象如何做到这一点。

最简单的方法是什么?当然,它也应该是高性能的,因为它被称为每秒 60 次(至少)。

4

1 回答 1

1

我建议您在创建 NSOpenGLViews 时使用上下文共享。

不幸的是,我对 cocoa (NeXTSTEP) OpenGL 窗口系统接口(我使用 CGL/AGL)没有太多经验,所以我无法准确告诉你如何做到这一点。但是,API 参考initWithFormat:shareContext可能会让您指向正确的方向。

我建议上下文共享的原因是因为您可以重复使用CVOpenGLTextureRef在这两种NSOpenGLView情况下都为您提供的纹理句柄。否则,您可能必须获取CVOpenGLTextureRef每个上下文(视图)。

为每个上下文执行此操作的开销可能没有您想象的那么高,Core Video 不必通过系统内存复制视频内容来为您提供 OpenGL 纹理 - 它已经在 GPU 上有一个可以使用的表面复制/参考。

于 2013-09-13T23:16:21.273 回答