iOS y Augmented Reality: Mostrar la cámara en un UIView


En la mayoría de las aplicaciones de realidad aumentada se usa la cámara.

La forma directa de mostrar la cámara es a través de la clase UIImagePickerController. Básicamente te permite abrir la cámara en todos los modos disponibles, hacer fotos, vídeos, ... Y usar un overlay que podéis colocar encima.

Sin embargo puede que por el diseño o los requisitos de vuestra aplicación el mencionado overlay no sea la opción más adecuada. ¿Cuál es la otra opción? : El framework AV Foundation.

Este método os va a permitir diseñar vuestra aplicación con vuestro Storyboard, XIB, ... y mostrar la previsualización de la cámara en el UIView que queráis. El cual no tiene porque ser de pantalla completa ni situarse en el centro.

Instrucciones:

  1. Añadir el framework de AV Foundation a vuestro proyecto.


  2. Necesitáis una referencia al UIView sobre el que queráis mostrar la cámara. Supongamos que la llamamos cameraView.
  3. Añadir el código:

    - (void)startCameraPreview {
      NSLog(@"startCameraPreview");
      captureSession = [[AVCaptureSession alloc] init];
      
      
      AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
      NSError *error = nil;
      AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];
      if (input) {
        [captureSession addInput:input];
        AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:captureSession];
        
          // Custom Fix to fill the view
        CGRect bounds=self.cameraView.layer.bounds;
        previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
        previewLayer.bounds=bounds;
        previewLayer.position=CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
        
        [self.cameraView.layer addSublayer:previewLayer];
        [captureSession startRunning];
      }
      else {
          // Handle the failure.
      }
      
    }

  4. No olvidéis llamar a stopRunning al acabar!
Con pequeñas modificaciones lo podéis adaptar para capturar audio o audio y video a la vez.