captureOutput:didOutputSampleBuffer:fromConnection:
我需要有选择地(并且可靠地)在我的方法中关闭对 sampleBuffers 的处理。如您所知,它是从 GCD 队列中调用的,而不是在主线程中调用的……但是我从 UIButton (当然在主线程中)获取用户输入,并通过设置 BOOL 标志告诉我的相机对象停止所有处理.
但是,有时我会在据称停止处理后看到 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,一个静态布尔,并使用一个信号量,但无济于事......有时那个额外的帧仍然潜入。任何人都有想法吗?可能有一些 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!
...
但通常(大约五分之四)我的控制台看起来像:
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...
因为它位于我无法控制的框架的超类中。