AVCaptureSession条码扫描

我目前正在使用AVCaptureSessionAVCaptureMetadataOutput

它完美的工作,但我只是想知道如何指示扫描和分析元数据对象只在AVCaptureVideoPreviewLayer的特定区域?

下面是一个项目的代码示例,我可以帮助你在正确的轨道上

  // where 'self.session' is previously setup AVCaptureSession // setup metadata capture AVCaptureMetadataOutput *metadataOutput = [[AVCaptureMetadataOutput alloc] init]; [self.session addOutput:metadataOutput]; [metadataOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; [metadataOutput setMetadataObjectTypes:@[AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeEAN13Code]]; // setup preview layer AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.session]; previewLayer.frame = self.previewView.bounds; previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; // we only want the visible area of the previewLayer to accept // barcode input (ignore the rest) // we need to convert rects coordinate system CGRect visibleMetadataOutputRect = [previewLayer metadataOutputRectOfInterestForRect:previewLayer.bounds]; metadataOutput.rectOfInterest = visibleMetadataOutputRect; // add the previewLayer as a sublayer of the displaying UIView [self.previewView.layer addSublayer:previewLayer]; 

在iOS 9.3.2中,当调用metadataoutputRectOfInterestForRect时,出现“CGAffineTransformInvert:singular matrix”错误。 我能够在AVCaptureSession startRunning方法之后startRunning调用它:

 captureSession.startRunning() let visibleRect = previewLayer.metadataOutputRectOfInterestForRect(previewLayer.bounds) captureMetadataOutput.rectOfInterest = visibleRect