2017-07-20 32 views
1

如何修复使用前置相机镜像捕获图像? SnapChat似乎修复它以及WhatsApp和Instagram,我怎么能? 我真的很想找到一个解决方案,这...它相当讨厌...先谢谢如何修复使用前置相机镜像捕获图像,AVFoundation,Swift

我见过Always seeing Mirror image while capturing from Front Camera iOS 5.0但它翻转后方照相机和正面的图像,它不能解决任何人真正的问题。如果任何人都可以帮助我弄清楚如何翻转前置摄像头图像或任何其他解决方案,那将非常棒!

import UIKit 
import AVFoundation 

@available(iOS 10.0, *) 
class CameraViewController: UIViewController,AVCaptureVideoDataOutputSampleBufferDelegate { 

let photoSettings = AVCapturePhotoSettings() 
    var audioPlayer = AVAudioPlayer() 
    var captureSession = AVCaptureSession() 
    var videoDeviceInput: AVCaptureDeviceInput! 
    var previewLayer = AVCaptureVideoPreviewLayer() 
    var frontCamera: Bool = false 
    var captureDevice:AVCaptureDevice! 
    var takePhoto = false 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     prepareCamera() 
    } 

    func prepareCamera() { 
     captureSession.sessionPreset = AVCaptureSessionPresetPhoto 

     if let availableDevices = AVCaptureDeviceDiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: .back).devices { 
      captureDevice = availableDevices.first 
      beginSession() 
     } 
    } 

    func frontCamera(_ front: Bool){ 
     let devices = AVCaptureDevice.devices() 

     do{ 
      try captureSession.removeInput(AVCaptureDeviceInput(device:captureDevice!)) 
     }catch{ 
      print("Error") 
     } 

     for device in devices!{ 
      if((device as AnyObject).hasMediaType(AVMediaTypeVideo)){ 
       if front{ 
        if (device as AnyObject).position == AVCaptureDevicePosition.front { 
         captureDevice = device as? AVCaptureDevice 

         do{ 
          try captureSession.addInput(AVCaptureDeviceInput(device: captureDevice!)) 
         }catch{} 
         break 
        } 
       }else{ 
        if (device as AnyObject).position == AVCaptureDevicePosition.back { 
         captureDevice = device as? AVCaptureDevice 

         do{ 
          try captureSession.addInput(AVCaptureDeviceInput(device: captureDevice!)) 
         }catch{} 
         break 
        } 
       } 
      } 
     } 
    } 

    func beginSession() { 
     do { 
      let captureDeviceInput = try AVCaptureDeviceInput(device: captureDevice) 
      if let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) { 
      self.previewLayer = previewLayer 
      containerView.layer.addSublayer(previewLayer as? CALayer ?? CALayer()) 
      self.previewLayer.frame = self.view.layer.frame 
      self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
      previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.portrait 
      captureSession.startRunning() 

      let dataOutput = AVCaptureVideoDataOutput() 
      dataOutput.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as NSString):NSNumber(value:kCVPixelFormatType_32BGRA)] 

      dataOutput.alwaysDiscardsLateVideoFrames = true 

      if captureSession.canAddOutput(dataOutput) { 
       captureSession.addOutput(dataOutput) 

       photoSettings.isHighResolutionPhotoEnabled = true 
       photoSettings.isAutoStillImageStabilizationEnabled = true 
      } 

      captureSession.commitConfiguration() 

      let queue = DispatchQueue(label: "com.NightOut.captureQueue") 
      dataOutput.setSampleBufferDelegate(self, queue: queue) 
     } 
    } 
     @IBAction func takePhoto(_ sender: Any) { 
      takePhoto = true 

      photoSettings.isHighResolutionPhotoEnabled = true 
      photoSettings.isAutoStillImageStabilizationEnabled = true 
    } 

    func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) { 
     if takePhoto { 
      takePhoto = false 
      if let image = self.getImageFromSampleBuffer(buffer: sampleBuffer) { 
       let photoVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "PhotoVC") as! PhotoPreviewViewController 

       photoVC.takenPhoto = image 

       DispatchQueue.main.async { 
        self.present(photoVC, animated: true, completion: { 
         self.stopCaptureSession() 
        }) 
       } 
      } 
     } 
    } 

    func getImageFromSampleBuffer (buffer:CMSampleBuffer) -> UIImage? { 
     if let pixelBuffer = CMSampleBufferGetImageBuffer(buffer) { 
      let ciImage = CIImage(cvPixelBuffer: pixelBuffer) 
      let context = CIContext() 

      let imageRect = CGRect(x: 0, y: 0, width: CVPixelBufferGetWidth(pixelBuffer), height: CVPixelBufferGetHeight(pixelBuffer)) 

      if let image = context.createCGImage(ciImage, from: imageRect) { 
       return UIImage(cgImage: image, scale: UIScreen.main.scale, orientation: .leftMirrored) 
      } 
    } 
     return nil 
    } 

    override func viewWillDisappear(_ animated: Bool) { 
     super.viewWillDisappear(animated) 

     self.captureSession.stopRunning() 
    } 

    func stopCaptureSession() { 
     self.captureSession.stopRunning() 

     if let inputs = captureSession.inputs as? [AVCaptureDeviceInput] { 
      for input in inputs { 
       self.captureSession.removeInput(input) 
      } 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    @IBAction func DismissButtonAction(_ sender: UIButton) { 

     UIView.animate(withDuration: 0.1, animations: { 
      self.DismissButton.transform = CGAffineTransform.identity.scaledBy(x: 0.8, y: 0.8) 
     }, completion: { (finish) in 
      UIView.animate(withDuration: 0.1, animations: { 
       self.DismissButton.transform = CGAffineTransform.identity 
      }) 
     }) 
     performSegue(withIdentifier: "Segue", sender: nil) 
    } 
} 
+0

的[总是看到镜像,同时从正面相机的iOS 5.0捕获](可能的复制https://stackoverflow.com/questions/9227450/总是看到镜像图像,而从前端摄像头捕获 - ios-5-0) –

+0

我看到..''LeftMirrored'为前置摄像头做了诀窍,但却让后置摄像头翻转图像你不想要... @CleverError – RandomGeek

回答

2

我这出自己,下面是解:

if captureDevice.position == AVCaptureDevicePosition.back { 
      if let image = context.createCGImage(ciImage, from: imageRect) { 
       return UIImage(cgImage: image, scale: UIScreen.main.scale, orientation: .right) 
       } 
      } 

       if captureDevice.position == AVCaptureDevicePosition.front { 
        if let image = context.createCGImage(ciImage, from: imageRect) { 
        return UIImage(cgImage: image, scale: UIScreen.main.scale, orientation: .leftMirrored) 

     } 
    } 
     } 
     return nil 
     } 
+0

正确的解决方案是将AVCaptureConnection对象的isVideoMirrored属性设置为true是captureOutput回调中的前置摄像头,在调用CMSampleBufferGetImageBuffer之前。 – Boon

0

我很久以前就做过了。我没有我的系统,但我可以说,水平变换预览图层,它会显示你想要的确切结果。为了保存和导出,你会在这里找到很多例子。

+0

当我离开镜像图层时,它也会镜像我的背部相机图像....不是一个好的解决方案 – RandomGeek

相关问题