gpt4 book ai didi

cocoa - 我应该使用 NSOperation 还是 NSRunLoop?

转载 作者:行者123 更新时间:2023-12-03 17:43:31 24 4
gpt4 key购买 nike

我正在尝试监视 FireWire 摄像机的视频输出流。我创建了一个带有按钮和 NSImageView 的 Interface Builder 界面。当图像监控发生在无限循环中时,我想:

  • 动态更改一些相机参数(增益、 Gamma 等)
  • 告诉监控停止,以便我可以将图像保存到文件中(设置一个停止 while 循环的标志)

使用按钮功能,我无法循环视频帧监视器,同时仍在寻找按钮按下(很像使用 C 中的按键功能。)有两个选项:

  1. 启动一个新的运行循环(我无法让自动释放池发挥作用...)
  2. 启动 NSOperation - 如何以允许我通过 Xcode 按钮推送进行连接的方式执行此操作?

文档对于创建此类对象非常迟钝。如果我按照我找到的示例创建一个 NSOperation,似乎无法与 Interface Builder 中的对象进行通信。当我创建 NSRunLoop 时,出现对​​象泄漏错误,并且找不到如何创建实际响应我创建的 RunLoop 的自动释放池的示例。没关系,我什至没有尝试选择辅助运行循环对哪些对象进行采样...

因为 Objective C(显然!)不是我的母语,所以我正在寻找简单的解决方案,抱歉地说......提前致谢

最佳答案

我需要做的几乎与您完全相同,只是通过 FireWire 摄像头进行连续视频显示。就我而言,我使用了 libdc1394 library为我们的 FireWire 相机执行帧捕获和相机属性调整。我知道您也可以使用一些 Carbon Quicktime 函数来完成此操作,但我发现 libdc1394 更容易理解一点。

对于视频捕获循环,我尝试了多种不同的方法,从轮询相机并锁定共享资源的单独线程,到使用一个 NSOperationQueue 与相机交互,最后决定使用 CVDisplayLink以与屏幕刷新率匹配的方式轮询相机。

使用以下代码配置 CVDisplayLink:

CGDirectDisplayID   displayID = CGMainDisplayID();  
CVReturn error = kCVReturnSuccess;
error = CVDisplayLinkCreateWithCGDisplay(displayID, &displayLink);
if (error)
{
NSLog(@"DisplayLink created with error:%d", error);
displayLink = NULL;
}
CVDisplayLinkSetOutputCallback(displayLink, renderCallback, self);

它调用以下函数来触发新相机帧的检索:

static CVReturn renderCallback(CVDisplayLinkRef displayLink, 
const CVTimeStamp *inNow,
const CVTimeStamp *inOutputTime,
CVOptionFlags flagsIn,
CVOptionFlags *flagsOut,
void *displayLinkContext)
{
return [(SPVideoView *)displayLinkContext renderTime:inOutputTime];
}

使用以下命令启动和停止 CVDisplayLink:

- (void)startRequestingFrames;
{
CVDisplayLinkStart(displayLink);
}

- (void)stopRequestingFrames;
{
CVDisplayLinkStop(displayLink);
}

每当我需要调整曝光、增益等时,我都会更改相应的实例变量并在标志变量中设置适当的位来指示要更改哪些设置,而不是在 FireWire 相机通信上使用锁定。下次检索帧时,CVDisplayLink 中的回调方法会更改相机上的相应设置以匹配本地存储的实例变量并清除该标志。

屏幕的显示是通过 NSOpenGLView 处理的(CAOpenGLLayer 在以此速率更新时引入了太多视觉伪像,并且其更新回调在主线程上运行)。苹果有一些extensions you can use使用 DMA 将这些帧作为纹理提供,以获得更好的性能。

不幸的是,我在这里描述的内容都不是入门级的内容。我在我们的软件中为这些相机处理功能编写了大约 2,000 行代码,花了很长时间才弄清楚。如果 Apple 可以将手动相机设置调整添加到 QTKit Capture API,我几乎可以删除所有这些。

关于cocoa - 我应该使用 NSOperation 还是 NSRunLoop?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5316474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com