2013-04-26 21 views
9

Ho letto circa un milione di thread su come realizzare un VideoPreviewLayer che riempie lo schermo completo di un iPhone ma niente funziona ... forse puoi aiutarmi perché sono davvero bloccato.AVCaptureVideoPreviewLayer non riempie la schermata

Questo è il mio Anteprima strato di init:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
{ 
    // Choosing bigger preset for bigger screen. 
    _sessionPreset = AVCaptureSessionPreset1280x720; 
} 
else 
{ 
    _sessionPreset = AVCaptureSessionPresetHigh; 
} 

[self setupAVCapture]; 

AVCaptureSession *captureSession = _session; 
AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:captureSession]; 
UIView *aView = self.view; 
previewLayer.frame = aView.bounds; 
previewLayer.connection.videoOrientation = AVCaptureVideoOrientationLandscapeRight; 
[aView.layer addSublayer:previewLayer]; 

Questo è il mio metodo setupAvCapture:

//-- Setup Capture Session. 
_session = [[AVCaptureSession alloc] init]; 
[_session beginConfiguration]; 

//-- Set preset session size. 
[_session setSessionPreset:_sessionPreset]; 

//-- Creata a video device and input from that Device. Add the input to the capture session. 
AVCaptureDevice * videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
if(videoDevice == nil) 
    assert(0); 

//-- Add the device to the session. 
NSError *error; 
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error]; 
if(error) 
    assert(0); 

[_session addInput:input]; 

//-- Create the output for the capture session. 
AVCaptureVideoDataOutput * dataOutput = [[AVCaptureVideoDataOutput alloc] init]; 
[dataOutput setAlwaysDiscardsLateVideoFrames:YES]; // Probably want to set this to NO when recording 

//-- Set to YUV420. 
[dataOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange] 
                 forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; // Necessary for manual preview 

// Set dispatch to be on the main thread so OpenGL can do things with the data 
[dataOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; 

[_session addOutput:dataOutput]; 
[_session commitConfiguration]; 

[_session startRunning]; 

Ho già provato a usare AVCaptureSessionPresets e opzioni ResizeFit diverso. Ma sembra sempre così:

http://imageshack.us/photo/my-images/707/img0013g.png/

O questo se uso previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; Se registro la dimensione del layer, viene restituita la dimensione a schermo intero corretta.

http://imageshack.us/photo/my-images/194/img0014k.png/

+0

Se imposto previewLayer.frame = CGRectMake (0, 0, 1280, 720); manualmente funziona ... qualcuno può spiegarlo. Sembra che la larghezza/altezza siano capovolte (ritratto) ma l'orientamento è in realtà paesaggio. Quindi posso correggere l'implementazione di _screenWidth = [UIScreen mainScreen] .bounds.size.width; _screenHeight = [UIScreen mainScreen] .bounds.size.height; if (_screenHeight> _screenWidth) { _screenWidth = _screenHeight; _screenHeight = [UIScreen mainScreen] .bounds.size.width; } – user2135074

risposta

42

prova:

AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [AVCaptureVideoPreviewLayer layerWithSession: self.session]; 
[captureVideoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 

Swift Aggiornamento

let previewLayer = AVCaptureVideoPreviewLayer(session: session) 
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 

Swift 4.0 Aggiornamento

let previewLayer = AVCaptureVideoPreviewLayer(session: session) 
previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill 
+0

Funziona al primo caricamento. Ma su riattivazione, questo non sembra fare il necessario. – mattdeboard

+0

forse dovresti interrompere la rotazione dell'anteprima della videocamera. Crea una vista trasparente sovrapposta all'anteprima dei pulsanti che stai per posizionare e lascialo girare. Penso che ruotare l'anteprima della fotocamera sia un po 'divertente e quanto sopra è la risposta giusta. :) – Nikolay

Problemi correlati