2013-04-26 18 views
9

Bir iPhone'un tam ekranını dolduran VideoPreviewLayer'ın nasıl yapılacağı hakkında bir milyon iş parçacığı okuyorum ancak hiçbir şey işe yaramıyor ... belki de bana yardımcı olabilirsiniz çünkü gerçekten sıkışmış durumdayım.AVCaptureVideoPreviewLayer ekranı doldurmuyor

Bu benim Önizleme katman init geçerli:

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

benim setupAvCapture Yöntem var:

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

Zaten AVCaptureSessionPresets ve ResizeFit seçenekleri farklı kullanmaya çalıştı. Ama her zaman şuna benzer:

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

Ya da bu kullandığım takdirde previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; Katmanın boyutunu günlüğe kaydedersem, doğru tam ekran boyutu döndürülür.

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

+0

Önizleme ayarlarsanız Layer.frame = CGRectMake (0, 0, 1280, 720); el ile çalışıyor ... bunu herkes açıklayabilir. Görünüşe göre genişlik/yükseklik ters çevrilmiş (portre) ancak yönlendirme aslında manzaradır. Bu yüzden _screenWidth = [UIScreen mainScreen] .bounds.size.width; _screenHeight = [UIScreen mainScreen] .bounds.size.height; if (_screenHeight> _screenWidth) { _screenWidth = _screenHeight; _screenHeight = [UIScreen mainScreen] .bounds.size.width; } – user2135074

cevap

42

deneyin:

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

Swift Güncelleme

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

Swift 4.0 Güncelleme

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

Bu, ilk yüklemede çalışır. Ancak rotasyonun yeniden uygulanmasında bu, ihtiyaç sahibi gibi görünmemektedir. – mattdeboard

+0

belki de kamera önizlemesinin dönüşünü durdurmalısınız. Yerleştireceğiniz ve döndürmeyi bırakacağınız düğmelerin önizlemesi üzerinde şeffaf bir görünüm oluşturun. Ben kamera önizleme döndürme biraz komik ve yukarıdaki doğru cevap olduğunu düşünüyorum. :) – Nikolay