我只需要使用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更好的性能。
不幸的是,我在這裏描述的沒有什麼是入門級的東西。在我們的軟件中,我有大約2000行代碼用於這些相機處理功能,而這需要很長時間才能解決。如果Apple可以將手動相機設置調整添加到QTKit Capture API,我可以刪除幾乎所有這些。
目前無法通過QTKit Capture APIs更改連接的FireWire相機的曝光,增益等參數(重複rdar:// 5760371「能夠爲QTKit Capture中的相機設置亮度,增益等API「如果你想這個功能)。 – 2011-03-15 20:57:13
我在使用QTKit的「可可是我的女朋友」中遇到過以下例子:[link] http://www.cimgf.com/2008/02/23/nsoperation-example/這看起來很有希望。我也使用libdc1394的東西,我已經到了它看起來像我捕獲的圖像。我無法訪問我可以使用的表單中的數據(將指針從無符號字符轉換爲來自14位相機的16位整數數組,最終保存爲tiff文件...) – 2011-03-17 15:59:27
如果您想要絕對控制,布拉德的方法是一個很好的方法,但我真的認爲QTKit是一條可行的路。使用NSOperation來完成這項工作非常好,但速度如此之快,可能沒有必要使用單獨的線程。 – 2011-03-17 16:28:12