最近,我正在iPhone上开发QR码识别。我使用AVFoundation框架。我使用 AVCaptureSession 连接AVCaptureDeviceInput和AVCaptureMetadataOutput并使用 AVCaptureVideoPreviewLayer 进行显示。 问题是,当AVCaptureSession startRunning时, AVCaptureVideoPreviewLayer首先变黑并逐渐恢复正常。问题是用户体验不佳。现在我使用GCD的dispatch_after()暂时解决这个问题。我知道还有其他解决方案。 因为AVCaptureSession的startRunning方法非常耗时,所以我在后台线程上调用startRunning()。我使用加载视图让用户等待AVCaptureSession启动。我观察“AVCaptureSessionDidStartRunningNotification”通知。但是当发布通知时,AVCaptureVideoPreviewLayer仍然是黑色的,并逐渐恢复正常。
dispatch_async(self.sessionQueue, ^{
[_avSession startRunning];
CGRect rectOfInterest = [_previewLayer metadataOutputRectOfInterestForRect:_config.rectOfInterest];
_metadataOutput.rectOfInterest = rectOfInterest;
}
}
});
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(avSessionDidStartRunning) name:AVCaptureSessionDidStartRunningNotification object:nil];