将CVPixelBuffer渲染到NSView(macOS)
我有一个将CVPixelBuffer渲染到NSView(macOS),macos,opengl,render,core-image,cvpixelbuffer,Macos,Opengl,Render,Core Image,Cvpixelbuffer,我有一个CVPixelBuffer,我正试图在屏幕上高效地绘制它 转换成NSImage的效率不高,但速度很慢,我的帧数下降了40% 因此,我尝试使用CIContext的drawImage:inRect:fromRect在屏幕上呈现它。CIContext是用NSOpenGLContext初始化的,who's view设置为my VC's view。当我有一个新图像时,我调用drawImage方法,它不会吐出任何错误。。。但也不会在屏幕上显示任何内容(当我的上下文设置不正确时,它会记录错误) 我试图
CVPixelBuffer
,我正试图在屏幕上高效地绘制它
转换成NSImage
的效率不高,但速度很慢,我的帧数下降了40%
因此,我尝试使用CIContext
的drawImage:inRect:fromRect
在屏幕上呈现它。CIContext
是用NSOpenGLContext
初始化的,who's view设置为my VC's view。当我有一个新图像时,我调用drawImage
方法,它不会吐出任何错误。。。但也不会在屏幕上显示任何内容(当我的上下文设置不正确时,它会记录错误)
我试图找到一个在MacOS上如何实现这一点的例子,但现在一切似乎都是针对iOS的
编辑:
下面是我正在使用的一些代码。我遗漏了不相关的部分
在viewdiload
I初始化总账和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的位置是否正确,但我似乎无法找到它应该放在哪里。如果
cvpixelbufferiosurfacecoreanimationcompatibilitykey
具有kCVPixelBufferIOSurfaceCoreAnimationCompatibilityKey属性,那么backingIOSurface
(通过CVPixelBufferGetIOSurface
检索)可以直接传递到CALayer
的contents
属性
这可能是显示CVPixelBuffer
您好的最有效的方法,欢迎使用。在您的问题被标记为关闭之前,我建议您重写它,因为在它的当前状态下,它不适合SO Q&A格式。请添加一些描述特定问题的实际代码。我已经添加了使用过的代码。。。但这并不多。我对OSX不是很熟练,但我认为您必须将gl上下文设置为当前(使用[glContext makeCurrentContext];
。并且不要忘记在渲染后交换缓冲区([glContext flushBuffer];
)。这是有逻辑的,但不起作用(已经尝试过)。我确实有了一个小小的突破,将所有代码移动到NSOpenGLView中,并在它的drawRect:
方法中调用drawImage:
方法…并调用glFlush()
最后。但是,图像显示在屏幕的右上角,非常模糊。这个位置让我想起了iOS上的GL渲染器是如何工作的……所以我确实知道如何解决这个问题。在我看来,你在混合使用OpenGL和OpenGL ES(“CI上下文”)。有很多有趣的信息,我会尽快看一看,以验证这是否有效。这是相当古老的,但我记得找到了一个解决方案,完全使用OpenGL(编写一个带有自定义着色器的渲染器和所有这些)-工作完美,速度非常快,但有很多代码。