Search code examples
iosavfoundationbarcodeavcapturesession

AVCaptureSession barcode scan


I'm currently working with AVCaptureSession and AVCaptureMetadataOutput.

It works perfectly, but I just want to know how to indicate to scan and analyze metadata objects only on a specific region of the AVCaptureVideoPreviewLayer?


Solution

  • Here is a sample of code from a project I have that may help you on the right track

        // 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];