如何正确停止AVCaptureSession

时间:2014-02-18 04:55:22

标签: ios avcapturesession

我正在做一个需要使用层次结构验证二维码的iOS应用程序:

View
---Scan View
---Image View - cardBG
---Inside View
  1. 加载视图时,隐藏扫描视图。
  2. 当用户单击按钮进行扫描时,内部视图和图像视图将被隐藏,显示扫描视图。
  3. 扫描返回成功后,内部和图像再次出现。
  4. 问题在于第3步:当我停止AVCaptureSession时,即使在像in this question这样的异步调度中,刷新视图也需要8-10秒。

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        if([_captureSession isRunning])[_captureSession stopRunning];
        AVCaptureInput* input = [_captureSession.inputs objectAtIndex:0];
        [_captureSession removeInput:input];
        AVCaptureVideoDataOutput* output = (AVCaptureVideoDataOutput*)[_captureSession.outputs objectAtIndex:0];
        [_captureSession removeOutput:output];
    });
    
    [self.bgImageView setHidden:NO];
    [self.insideView setHidden:NO];
    [self.scanView setHidden:YES];
    [self.previewLayer removeFromSuperlayer];
    

    我的问题是:我怎样才能避免这种冻结?

2 个答案:

答案 0 :(得分:2)

没有更多的背景很难说。取决于实际导致延迟的原因。这样的事情会起作用吗?

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    if([_captureSession isRunning])[_captureSession stopRunning];

    dispatch_async(dispatch_get_main_queue(), ^{
      [self.bgImageView setHidden:NO];
      [self.insideView setHidden:NO];
      [self.scanView setHidden:YES];
      [self.previewLayer removeFromSuperlayer];        
    });

    AVCaptureInput* input = [_captureSession.inputs objectAtIndex:0];
    [_captureSession removeInput:input];
    AVCaptureVideoDataOutput* output = (AVCaptureVideoDataOutput*)[_captureSession.outputs objectAtIndex:0];
    [_captureSession removeOutput:output];    

});

答案 1 :(得分:1)

以下代码可以帮助您:

if(self.previewLayer) {
    [self.previewLayer removeFromSuperlayer];
    self.previewLayer = nil;
}

if(_captureSession) {
    [_captureSession stopRunning];
    _captureSession = nil;
}