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