【问题标题】:Render a CVPixelBuffer to an NSView (macOS)将 CVPixelBuffer 渲染到 NSView (macOS)
【发布时间】:2018-02-28 06:23:54
【问题描述】:

我有一个CVPixelBuffer,我正在尝试在屏幕上有效地绘制它。

转换成NSImage 的效率不高的方法有效,但速度很慢,丢掉了大约 40% 的帧。

因此,我尝试使用CIContextdrawImage:inRect:fromRect 在屏幕上渲染它。 CIContextNSOpenGLContext 初始化,他的视图设置为我的 VC 的视图。当我有一个新图像时,我调用drawImage 方法,它不会吐出任何错误......但也不会在屏幕上显示任何内容(当我的上下文设置不正确时它会记录错误)。

我试图找到如何在 MacOS 上完成此操作的示例,但现在一切似乎都适用于 iOS。

编辑:

这是我正在使用的一些代码。我省略了不相关的部分

viewDidLoad 上,我初始化 GL 和 CI 上下文

NSOpenGLPixelFormatAttribute pixelFormatAttr[] = {
  kCGLPFAAllRenderers, 0
};
NSOpenGLPixelFormat *glPixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes: pixelFormatAttr];
NSOpenGLContext *glContext = [[NSOpenGLContext alloc] initWithFormat:glPixelFormat shareContext:nil];
glContext.view = self.view;

self.ciContext = [CIContext contextWithCGLContext:glContext.CGLContextObj pixelFormat:glPixelFormat.CGLPixelFormatObj colorSpace:nil options:nil];

然后,当新框架准备好时,我会这样做:

dispatch_async(dispatch_get_main_queue(), ^{
       [vc.ciContext drawImage:ciImage inRect:vc.view.bounds fromRect:ciImage.extent];
        vc.isRendering = NO;
});

我不确定我在正确的地方调用 draw,但我似乎无法找出它应该去哪里。

【问题讨论】:

  • 您好,欢迎来到 SO。在您将问题标记为已关闭之前,我建议您重写它,因为在当前状态下它不适合 SO Q&A 格式。请添加一些描述特定问题的实际代码。
  • 我已经添加了使用的代码......但它并不多。
  • 我对 OSX 不是很熟练,但我认为您必须将 gl-context 设置为当前(使用[glContext makeCurrentContext];。并且不要忘记在您使用后交换缓冲区([glContext flushBuffer];)渲染。
  • 这是有道理的,但它不起作用(已经试过了)。通过将所有代码移动到 NSOpenGLView 中并在其 drawRect: 方法中调用 drawImage: 方法并在最后调用 glFlush(),我确实取得了一点突破。但是,图像显示在屏幕的右上角,并且非常模糊。这个定位让我想起了 iOS 上的 GL 渲染器是如何工作的……所以我确实知道如何解决这个问题。
  • 在我看来,您正在混合使用 OpenGL 和 OpenGL-ES(即“CI 上下文”)。 Apple Developers site 有很多信息

标签: macos opengl render core-image cvpixelbuffer


【解决方案1】:

如果CVPixelBuffer 具有kCVPixelBufferIOSurfaceCoreAnimationCompatibilityKey 属性,则支持IOSurface(通过CVPixelBufferGetIOSurface 检索)可以直接传递给CALayercontents 属性。

这可能是显示CVPixelBuffer 的最有效方式。

【讨论】:

  • 这很有趣,我会尽快看看是否有效。这已经很老了,但我记得通过完全使用 OpenGL(编写带有自定义着色器的渲染器等等)找到了一个解决方案 - 完美无缺且非常快,但是它有很多代码。
猜你喜欢
  • 2022-01-23
  • 2011-05-29
  • 1970-01-01
  • 2021-08-15
  • 2018-01-09
  • 1970-01-01
  • 2021-11-17
  • 2013-02-01
  • 2023-04-05
相关资源
最近更新 更多