Eugene Yu
Eugene Yu

Reputation: 3958

iOS7 AVCapture captureOutput never gets called

Please understand that I cannot upload the whole code here.

I have

@interface BcsProcessor : NSObject <AVCaptureMetadataOutputObjectsDelegate> {}

and BcsProcessor has setupCaptureSession and captureOutput method.

- (void)captureOutput:(AVCaptureOutput*)captureOutput didOutputMetadataObjects:(NSArray*)metadataObjects fromConnection:(AVCaptureConnection*)connection


- (NSString*)setUpCaptureSession {
    NSError* error = nil;

    AVCaptureSession* captureSession = [[[AVCaptureSession alloc] init] autorelease];
    self.captureSession = captureSession;

       AVCaptureDevice* __block device = nil;
    if (self.isFrontCamera) {

        NSArray* devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
        [devices enumerateObjectsUsingBlock:^(AVCaptureDevice *obj, NSUInteger idx, BOOL *stop) {
            if (obj.position == AVCaptureDevicePositionFront) {
                device = obj;
            }
        }];
    } else {
        device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    }

    AVCaptureDeviceInput* input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];

    AVCaptureMetadataOutput* output = [[[AVCaptureMetadataOutput alloc] init] autorelease];
    output.metadataObjectTypes = output.availableMetadataObjectTypes

    dispatch_queue_t outputQueue = dispatch_queue_create("com.1337labz.featurebuild.metadata", 0);
    [output setMetadataObjectsDelegate:self queue:outputQueue];

    captureSession.sessionPreset = AVCaptureSessionPresetPhoto;

    if ([captureSession canAddInput:input]) {
        [captureSession addInput:input];
    }

    if ([captureSession canAddOutput:output]) {
        [captureSession addOutput:output];
    }

    // setup capture preview layer
    self.previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:captureSession];

    // run on next event loop pass [captureSession startRunning]
    [captureSession performSelector:@selector(startRunning) withObject:nil afterDelay:0];

    return nil;
}

So the code above sets up the session and add AVCaptureMetadataOutput. and BcsProcessor is supposed to receive the captured metadata. but my captureOutput method does not receive any data, or gets called.

I'll appreciate any help or comments.

Upvotes: 1

Views: 2045

Answers (1)

zero7
zero7

Reputation: 1298

First make sure your input and output are correctly added to the session. You can check by logging captureSession.inputs and captureSession.outputs.

Second make sure output.metadataObjectTypes is correctly setup meaning output of availableMetadataObjectTypes is not empty. I believe this will be empty if you call it before adding the output.

and finally i don't see you adding the preview layer to the views layer try after you init your layer with session...

self.previewLayer.frame = self.view.layer.bounds;
[self.view.layer addSublayer:previewLayer];

Upvotes: 3

Related Questions