我需要選擇性地(和可靠地)關閉captureOutput:didOutputSampleBuffer:fromConnection:
方法中的sampleBuffers處理。正如你所知道的,它是從GCD隊列中調用的,而不是在主線程中調用的......但是我從UIButton中獲取用戶輸入(當然是在主線程中),並通過設置BOOL標誌來告訴我的相機對象停止所有處理。iOS:有選擇地禁用處理captureOutput:didOutputSampleBuffer:fromConnection:來自AVFoundation中的主線程
但是,有時我會在處理被認爲停止之後看到1個額外的框架滑落。有沒有什麼方法可以絕對確保在按下按鈕後不會處理任何內容?現在我做一個簡單的測試:
// in ViewController:
- (IBAction)tappedStop:(id)sender {
NSLog("stop processing!");
_camera.capturing = NO;
}
// in my camera obj:
- (void)captureOutput:(AVCaptureOutput *)captureOutput did... {
if (!capturing) {
return;
}
NSLog(@"processing!");
}
我使用@synchronized,靜態BOOL嘗試,並使用信號量,但是沒有用......有時額外的框架還在偷偷的任何人。有和想法?可能有一些GCD方法可以做我想做的,但我不知道如何去做。
這裏是如何的結果(有時)在我的調試控制檯看(縮短,使其更具可讀性):
2012-09-29 23:29:01.869 __33-_block_invoke_0 [Line 322] processing!
2012-09-29 23:29:01.910 __33-_block_invoke_0 [Line 322] processing!
2012-09-29 23:29:01.953 __33-_block_invoke_0 [Line 322] processing!
2012-09-29 23:29:01.994 __33-_block_invoke_0 [Line 322] processing!
2012-09-29 23:29:02.047 __33-_block_invoke_0 [Line 322] processing!
2012-09-29 23:29:02.078 __33-_block_invoke_0 [Line 322] processing!
2012-09-29 23:29:02.121 __33-_block_invoke_0 [Line 322] processing!
2012-09-29 23:29:02.166 -[ViewController tappedButton:] [Line 913] stop processing!
2012-09-29 23:29:02.161 __33-_block_invoke_0 [Line 322] processing!
...
但通常(約4出5次)我的控制檯看起來像:
2012-09-29 23:29:01.869 __33-_block_invoke_0 [Line 322] processing!
2012-09-29 23:29:01.910 __33-_block_invoke_0 [Line 322] processing!
2012-09-29 23:29:01.953 __33-_block_invoke_0 [Line 322] processing!
2012-09-29 23:29:01.994 __33-_block_invoke_0 [Line 322] processing!
2012-09-29 23:29:02.047 __33-_block_invoke_0 [Line 322] processing!
2012-09-29 23:29:02.078 __33-_block_invoke_0 [Line 322] processing!
2012-09-29 23:29:02.121 __33-_block_invoke_0 [Line 322] processing!
2012-09-29 23:29:02.166 -[ViewController tappedButton:] [Line 913] stop processing!
我也許應該提一下,我沒有訪問原始隊列的captureOutput:didOutput...
,因爲它位於我無法控制的框架的超類中。
除了那個日誌你還有什麼測量?因爲它是在您設置標誌之前放置的。也許這只是一個錯字,但不管你做了多少同步測量技術,有時還會顯示你正在生成的日誌。另外,當這個標誌被設置時,你的要求是處理保釋的一部分嗎? –
嘿,是否可以刪除「gcd」標籤,因爲我們已經有了「大中央調度」,並添加了「比賽條件」? –
我唯一使用的測量是顯示/隱藏視圖以查看幀是否實際上仍在輸出。我知道這是一種誤導,因爲調試輸出中「額外幀」的時間戳發生在我的「停止處理」行('2012-09-29 23:29:02.161')之前。回覆:標籤,當然如果你認爲這有助於更多,那就去吧。 – taber