Search code examples
iosavfoundationavcapturesessionavcapturedevice

Get Camera Preview to AVCaptureVideoPreviewLayer


I was trying to get the camera input to show on a preview layer view.

self.cameraPreviewView is tied to a UIView in IB

Here is my current code that I put together from the AV Foundation Programming Guide. But the preview never shows

AVCaptureSession *session = [[AVCaptureSession alloc] init];
    session.sessionPreset = AVCaptureSessionPresetHigh;

    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

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

    if (!input) {
        NSLog(@"Couldn't create video capture device");
    }
    [session addInput:input];


        // Create video preview layer and add it to the UI
        AVCaptureVideoPreviewLayer *newCaptureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
        UIView *view = self.cameraPreviewView;
        CALayer *viewLayer = [view layer];

        newCaptureVideoPreviewLayer.frame = view.bounds;

        [viewLayer addSublayer:newCaptureVideoPreviewLayer];

        self.cameraPreviewLayer = newCaptureVideoPreviewLayer;



        [session startRunning];

Solution

  • So after some trial and error and looking at apple's AVCam Sample Code

    I wrapped the PreviewLayer code and session startRunning into a grand central dispatch block like so and it started working.

     dispatch_async(dispatch_get_main_queue(), ^{
        AVCaptureVideoPreviewLayer *newCaptureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
        UIView *view = self.cameraPreviewView;
        CALayer *viewLayer = [view layer];
    
        newCaptureVideoPreviewLayer.frame = view.bounds;
    
        [viewLayer addSublayer:newCaptureVideoPreviewLayer];
    
        self.cameraPreviewLayer = newCaptureVideoPreviewLayer;
    
        [session startRunning];
    });