2011-10-22 12 views
5

Estoy desarrollando alguna aplicación de iOS, donde debo hacer un escaneo de la cámara. Esta es mi primera experiencia con AVFoundation, anteriormente desarrollé aplicaciones de cámara con UIImagePickerController, pero AVFoundation parece ser más potente.AVFoundation, corte los bordes en la capa de vista previa

El problema es que corta los bordes en la capa de vista previa, independientemente de que configure el marco de la capa de vista previa tan grande como la del controlador de vista.

Este es mi código:

AVCaptureSession *captureSession = [[AVCaptureSession alloc] init]; 
    AVCaptureDevice *photoCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
    NSError *error = nil; 
    AVCaptureDeviceInput *videoInput = [AVCaptureDeviceInput deviceInputWithDevice:photoCaptureDevice error:&error]; 
    if(videoInput){ 
     [captureSession addInput:videoInput]; 
     [captureSession startRunning]; 
     NSLog(@"ok"); 
    } 
    AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:captureSession]; 
    previewLayer.frame = self.view.bounds; 
    NSLog(@"%f %f", previewLayer.frame.size.width, previewLayer.frame.size.height); 
    [self.view.layer addSublayer:previewLayer]; 

estaría muy agradecido por una ayuda, Artem

Respuesta

20

Esto es debido a que la relación de aspecto del vídeo que está capturando es diferente a la de la pantalla. No hay mucho que pueda hacer, ya sea el boxeo de letras o el escalado no uniforme de la imagen. Usted puede arrojar algunos píxeles en el borde corto, que es probablemente lo que hace UIImagePickerController.

Si desea este comportamiento, intente establecer

previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
+0

Muchas gracias, va a trabajar en la solución. – Artem

+0

De nada, solución añadida. –

+0

¡Gracias, me ayuda mucho! – james075

7

En realidad, la solución era muy simple, como rítmica Fistman mencionó que hay una propiedad en AVCaptureVideoPreviewLayer - videoGravity. Así que para ajustarse a la capa de vista previa en la vista personalizada:

previewLayer.frame = self.view.bounds; 
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
// Specifies that the player should preserve the video’s aspect ratio and fill the layer’s bounds. 

o

previewLayer.videoGravity = AVLayerVideoGravityResize; 
// Specifies that the video should be stretched to fill the layer’s bounds. 
+0

y la imagen tomada es del mismo tamaño con los límites de vista previa? – crz

+0

Gracias. Es salvar mi vida –

Cuestiones relacionadas