2011-10-22 9 views
5

Sto sviluppando alcune app per iOS, in cui ho bisogno di eseguire alcune scansioni della fotocamera. Questa è la mia prima esperienza con AVFoundation, in precedenza ho sviluppato app per fotocamere con UIImagePickerController, ma AVFoundation sembra essere più potente.AVFoundation, tagliare i bordi nel livello di anteprima

Il problema è che taglia i bordi nel livello di anteprima, indipendentemente dal fatto che imposto il frame del livello di anteprima grande come quello del controller di visualizzazione.

Questo è il mio codice:

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

sarei molto grato per un aiuto, Artem

risposta

20

Questo perché il rapporto di aspetto del video che si sta catturando è diversa da quella della schermo. Non c'è molto che tu possa fare: è il letterboxing o il ridimensionamento non uniforme dell'immagine. È possibile possibile eliminare alcuni pixel sul lato corto, che è probabilmente ciò che fa UIImagePickerController.

Se si desidera questo comportamento, provare a impostare

previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
+0

ringrazio molto, dovrà lavorare sulla soluzione. – Artem

+0

Prego, aggiunta la soluzione. –

+0

Grazie, mi aiuta molto! – james075

7

In realtà la soluzione è stata abbastanza semplice, come ritmica Fistman accennato v'è una proprietà in AVCaptureVideoPreviewLayer - videoGravity. Quindi, per adattare il livello di anteprima nella visualizzazione personalizzata:

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

e l'immagine presa ha le stesse dimensioni con i limiti di anteprima? – crz

+0

Grazie. Mi ha salvato la vita –

Problemi correlati