AVFoundation:在进入摄像机视图时滞后

时间:2015-07-09 19:35:50

标签: ios objective-c iphone camera avfoundation

我已成功将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];
}

此方法在viewDidLoadviewWillAppear fire [self startRunning]中启动(仅启动相机会话。

这里最大的罪犯看起来像dispatch_queue_t metadataQueue = dispatch_get_main_queue();当我从前一个视图控制器发出segue时,主线程被阻止启动摄像头,并暂时阻止UI?是否最好将相机设置在不同的线程中?

修改 我将[self startRunning]移到了viewDidAppear,这有助于segue大幅延迟,但是在相机预览加载之前需要一秒钟。有没有优雅的方法来减少相机的实时预览时间?

0 个答案:

没有答案