2016-06-21 2 views
1

Я использую AVFoundation для съемки фотографий с помощью фронтальной камеры. Когда устройство ориентировано на ландшафт, все работает нормально, но когда пейзаж прав, снимки перевернуты вверх ногами.Ландшафтная фотография передних фотоаппаратов с перевернутой вверх

func setOutputOrientation() { 
    var outputOrientation: AVCaptureVideoOrientation! 
    let connection = self.previewLayer.connection 

    if UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeLeft { 
     outputOrientation = AVCaptureVideoOrientation.LandscapeRight 
    } 

    else if UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeRight { 
     outputOrientation = AVCaptureVideoOrientation.LandscapeLeft 
    } 

    else if UIDevice.currentDevice().orientation == UIDeviceOrientation.Portrait { 
     outputOrientation = AVCaptureVideoOrientation.Portrait 
    } 

    else if UIDevice.currentDevice().orientation == UIDeviceOrientation.PortraitUpsideDown { 
     outputOrientation = AVCaptureVideoOrientation.PortraitUpsideDown 
    } 

    connection.videoOrientation = outputOrientation 
    } 

и следующее в viewDidLoad:

let device = getFrontCamera( 
let error : NSError? = nil 

let input: AVCaptureDeviceInput? 
do { 
    input = try AVCaptureDeviceInput(device: device) 
} catch _ { 
    input = nil 
} 
if input != nil { 
    session.addInput(input) 
} 

else { 
    print(error) 
} 

session.sessionPreset = AVCaptureSessionPresetPhoto 

previewLayer = AVCaptureVideoPreviewLayer(session: session) as AVCaptureVideoPreviewLayer 
previewLayer.frame = CGRectMake(0, 0, 300, 300) 
previewLayer.setAffineTransform(CGAffineTransformTranslate(CGAffineTransformMakeScale(0.33, 0.33), -375, -480)) 
previewLayer.position = upperRightPosition 
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
self.view.layer.addSublayer(previewLayer) 

let photoImage = UIImage(named:"PhotoTwo") 

session.startRunning() 

output.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG] 

if session.canAddOutput(output) 
{ 
    session.addOutput(output) 
} 

self.setOutputOrientation() 

ответ

2

Запустите конфигурацию камеры ...

if captureSession.canAddOutput(videoOutput) { 
     captureSession.addOutput(videoOutput) 
     let connection = videoOutput.connectionWithMediaType(AVMediaTypeVideo) 
     if connection.supportsVideoOrientation { 
      connection.videoOrientation = isFrontCamera ? AVCaptureVideoOrientation.LandscapeLeft : AVCaptureVideoOrientation.LandscapeRight 
     } 
     print("adding output") 

    } else { 
     print("Could not add front video output") 
     return 
    } 

    captureSession.commitConfiguration() 
    captureSession.startRunning() 

... настроить предварительный просмотр слой для камеры.

func setupPreviewLayer() {   
    var previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
    var bounds = cameraView.bounds 
    previewLayer.backgroundColor = UIColor.blackColor().CGColor 
    previewLayer.bounds = bounds 
    previewLayer.videoGravity = AVLayerVideoGravityResize 
    previewLayer.position = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds)) 
    previewLayer.connection.videoOrientation = recordingOrientation; 
    self.cameraView.layer.addSublayer(previewLayer) 

} 

Вы можете попробовать несколько рабочих обходные один вариант существо:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 
    if UIDevice.currentDevice().orientation.isLandscape.boolValue { 
     print("Landscape") 
    } else { 
     print("Portrait") 
    } 
} 

Другая работа вокруг будет вращать и/или переворачивать изображение после того, как снимок сделан.

+0

Уровень предварительного просмотра отображается точно так, как должен, это просто снятое фото, это неправильно. – lunadiviner

+0

Моя забота заключалась в том, что вы делаете вызовы методов. Например, вы 'session.startRunning()' перед добавлением 'output' – Asdrubal

+0

Я изменил его так, что session.startRunning() - это последнее, что называется, и я также попытался установить ориентацию вывода в функции захвата фотографий до фото сделана, но я все еще сталкиваюсь с той же проблемой. – lunadiviner

Смежные вопросы