2011-10-22 13 views
5

Zajmuję jakąś aplikację na iOS, gdzie trzeba zrobić kilka skanowania kamery. To jest moje pierwsze doświadczenie z AVFoundation, wcześniej I rozwinięte aplikacje aparatu z UIImagePickerController, ale AVFoundation wydaje się być mocniejszy.AVFoundation, odcięte krawędzie w warstwie podglądu

Problemem jest to, że obcina krawędzie w warstwie podglądu, niezależnie od tego, że mogę ustawić ramkę preview warstwy jest tak duża, jak jeden widok kontrolera.

To jest mój kod:

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

byłby bardzo wdzięczny za pomoc, Artem

Odpowiedz

20

To dlatego, że proporcje filmu, że jesteś przechwytywania jest inny niż z ekran. Niewiele można zrobić - jest to albo boks literowy albo niejednolite skalowanie obrazu. Ci może wyrzucić niektóre piksele na krótszej krawędzi, co jest chyba to, co robi UIImagePickerController.

Jeśli chcesz ten problem, spróbuj ustawić

previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
+0

Dziękuję bardzo, będzie pracować nad rozwiązaniem. – Artem

+0

Nie ma za co, dodane rozwiązanie. –

+0

Dziękuję, bardzo mi to pomaga! – james075

7

Faktycznie rozwiązanie było dość proste, jak rytmiczne Fistman wspomniano jest nieruchomość w AVCaptureVideoPreviewLayer - videoGravity. Tak, aby pasowały do ​​warstwy podglądu w widoku niestandardowego:

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. 

lub

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

, a zrobione zdjęcie ma ten sam rozmiar z podglądem? – crz

+0

Dzięki. To uratuje moje życie –

Powiązane problemy