2011-03-15 154 views
0

我正在嘗試監視FireWire攝像機的視頻輸出流。我創建了一個帶有按鈕和NSImageView的Interface Builder接口。雖然圖像監控是一個永無止境的循環中發生的,我想:我應該使用NSOperation還是NSRunLoop?

  • 動態更改某些相機參數(增益,伽瑪等)
  • 告訴監控停止,所以我可以保存爲圖像一個文件(設置停止while循環標誌)

使用按鈕的功能,我已經無法循環的視頻幀監控,同時還在尋找一個按下按鈕(就像使用的keyPressed功能由C )有兩種選擇:

  1. 啓動一個新的運行循環(爲此,我無法使autoreleasepool運行...)
  2. 啓動NSOperation - 我如何以允許我連接Xcode按鈕按鈕的方式執行此操作?

關於創建這些對象的文檔非常呆滯。如果按照我找到的示例創建NSOperation,則似乎無法使用Interface Builder中的對象與其通信。當我創建一個NSRunLoop時,我得到一個對象泄漏錯誤,並且我找不到如何創建實際響應我創建的RunLoop的autoreleasepool的示例。沒想到,我甚至沒有試圖選擇哪些物體通過二級運行循環採樣...

因爲Objective C是(顯然!)不是我的母語,我正在尋找嬰兒步驟的解決方案,對不起說... 在此先感謝

回答

2

我只需要使用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,我可以刪除幾乎所有這些。

0

如果所有你想要做的是看到/抓住連接的攝像頭的輸出,答案可能都不是。

使用QTKit's QTCaptureView。問題解決了。想要grab a frame?也沒問題。不要試圖推出自己的產品 - QTKit的東西已經過優化並且是操作系統的一部分。我敢肯定,你可以影響相機屬性,如果你想,但如果沒有,計劃乙應該工作。

B計劃:使用計劃,經常性NSTimer問QTKit搶一個框架,每隔一段時間(「如何做」上面鏈接),並在您的NSImageView顯示前應用圖像操縱的框架(也許與Core Image)。

+0

目前無法通過QTKit Capture APIs更改連接的FireWire相機的曝光,增益等參數(重複rdar:// 5760371「能夠爲QTKit Capture中的相機設置亮度,增益等API「如果你想這個功能)。 – 2011-03-15 20:57:13

+0

我在使用QTKit的「可可是我的女朋友」中遇到過以下例子:[link] http://www.cimgf.com/2008/02/23/nsoperation-example/這看起來很有希望。我也使用libdc1394的東西,我已經到了它看起來像我捕獲的圖像。我無法訪問我可以使用的表單中的數據(將指針從無符號字符轉換爲來自14位相機的16位整數數組,最終保存爲tiff文件...) – 2011-03-17 15:59:27

+0

如果您想要絕對控制,布拉德的方法是一個很好的方法,但我真的認爲QTKit是一條可行的路。使用NSOperation來完成這項工作非常好,但速度如此之快,可能沒有必要使用單獨的線程。 – 2011-03-17 16:28:12

相關問題