メソッドで sampleBuffers の処理を選択的に (そして確実に) オフにする必要がありますcaptureOutput:didOutputSampleBuffer:fromConnection:
。ご存じのように、メイン スレッドではなく 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、静的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!
...
しかし、通常 (5 回のうち約 4 回) 私のコンソールは次のようになります。
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...
また、呼び出し元のキューは制御できないフレームワークのスーパークラスにあるため、アクセスできないことにも言及する必要があります。