我已成功将QRCode扫描仪应用到我的应用程序中,一切运行良好且性能良好。但是,在我的应用程序的主屏幕上,当您按下按钮以切换到执行扫描的实际视图控制器时,至少有750毫秒/ 1秒的延迟。
以下是相机设置:
- (void)setupCaptureSession { // 1
if (_captureSession) return;
// 2
_videoDevice = [self frontCamera];//[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if (!_videoDevice) {
DDLogWarn(@"No video camera on this device!"); return;
}
// 3
_captureSession = [[AVCaptureSession alloc] init];
// 4
_videoInput = [[AVCaptureDeviceInput alloc] initWithDevice:_videoDevice error:nil];
// 5
if ([_captureSession canAddInput:_videoInput]) { [_captureSession addInput:_videoInput];
}
// 6
_previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession];
_previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
_metadataOutput = [[AVCaptureMetadataOutput alloc] init];
//dispatch_queue_t metadataQueue = dispatch_queue_create("org.iso.QRCode.metadata", 0);
dispatch_queue_t metadataQueue = dispatch_get_main_queue();
[_metadataOutput setMetadataObjectsDelegate:self queue:metadataQueue];
if ([_captureSession canAddOutput:_metadataOutput]) {
//DDLogNotice(@"WE ARE OUTPUTING METADATA!");
[_captureSession addOutput:_metadataOutput];
_metadataOutput.metadataObjectTypes = @[AVMetadataObjectTypeQRCode];
}
// [self startRunning];
}
此方法在viewDidLoad
和viewWillAppear
fire [self startRunning]
中启动(仅启动相机会话。
这里最大的罪犯看起来像dispatch_queue_t metadataQueue = dispatch_get_main_queue();
当我从前一个视图控制器发出segue时,主线程被阻止启动摄像头,并暂时阻止UI?是否最好将相机设置在不同的线程中?
修改
我将[self startRunning]
移到了viewDidAppear
,这有助于segue大幅延迟,但是在相机预览加载之前需要一秒钟。有没有优雅的方法来减少相机的实时预览时间?