Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将CVPixelBuffer渲染到NSView(macOS)_Macos_Opengl_Render_Core Image_Cvpixelbuffer - Fatal编程技术网

将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属性,那么backing
IOSurface
(通过
CVPixelBufferGetIOSurface
检索)可以直接传递到
CALayer
contents
属性


这可能是显示
CVPixelBuffer

您好的最有效的方法,欢迎使用。在您的问题被标记为关闭之前,我建议您重写它,因为在它的当前状态下,它不适合SO Q&A格式。请添加一些描述特定问题的实际代码。我已经添加了使用过的代码。。。但这并不多。我对OSX不是很熟练,但我认为您必须将gl上下文设置为当前(使用
[glContext makeCurrentContext];
。并且不要忘记在渲染后交换缓冲区(
[glContext flushBuffer];
)。这是有逻辑的,但不起作用(已经尝试过)。我确实有了一个小小的突破,将所有代码移动到NSOpenGLView中,并在它的
drawRect:
方法中调用
drawImage:
方法…并调用
glFlush()
最后。但是,图像显示在屏幕的右上角,非常模糊。这个位置让我想起了iOS上的GL渲染器是如何工作的……所以我确实知道如何解决这个问题。在我看来,你在混合使用OpenGL和OpenGL ES(“CI上下文”)。有很多有趣的信息,我会尽快看一看,以验证这是否有效。这是相当古老的,但我记得找到了一个解决方案,完全使用OpenGL(编写一个带有自定义着色器的渲染器和所有这些)-工作完美,速度非常快,但有很多代码。