2017-10-21 32 views
0

J'essaie de mettre en œuvre une caméra personnalisée similaire à Snapchat. Je ne vois pas pourquoi mon image est toujours nulle pendant la séance. Peut-être une nouvelle paire d'yeux peut-être utile que j'ai travaillé sur ce pendant 2 jours maintenant ...AVCapturePhoto Pourquoi ma photo est toujours nulle?

Lorsque je tape sur le bouton prendre la photo (pour exécuter "livePhotoTapped"), l'application se bloque avec erreur: erreur fatale: de façon inattendue trouvé nulle en déballant une valeur facultative, se référant à l'image étant nulle

Toute aide serait bien :)

@IBOutlet weak var cameraView: UIView! 

//session to capture data 
var captureSession = AVCaptureSession() 
//which camera to use 
var backFacingCamera: AVCaptureDevice? 
var frontFacingCamera: AVCaptureDevice? 
var currentDevice: AVCaptureDevice? 

var stillImageOutput: AVCaptureStillImageOutput? 
var stillImage: UIImage? 

//camera preview layer 
var cameraPreviewLayer: AVCaptureVideoPreviewLayer? 


func setupCaptureSessionCamera() { 
    //this makes sure to get full res of camera 
    captureSession.sessionPreset = AVCaptureSession.Preset.photo 

    var devices = AVCaptureDevice.devices(for: .video) 

    //query available devices 
    for device in devices { 

     if device.position == .front { 
      frontFacingCamera = device 
     } else if device.position == .back { 
      backFacingCamera = device 
     } 
    }//end iteration 

    //set a default device 
    currentDevice = backFacingCamera 

    //configure session w output for capturing still img 
    stillImageOutput = AVCaptureStillImageOutput() 
    stillImageOutput?.outputSettings = [AVVideoCodecKey : AVVideoCodecType.jpeg] 


    do { 
     //capture the data from whichevr camera we r using..imagine as buffer to translate data into real world image 
     let captureDeviceInput = try AVCaptureDeviceInput(device: currentDevice!) 

     captureSession.addInput(captureDeviceInput) 
     captureSession.addOutput(stillImageOutput!) 

     //setup camera preview layer 
     cameraPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 

     //add the preview to our specified view in the UI 
     view.layer.addSublayer(cameraPreviewLayer!) 
     cameraPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill 
     cameraPreviewLayer?.frame = cameraView.frame 

     captureSession.startRunning() 

    } catch let error { 

     print(error) 

    }//end do 
} 

    @IBAction func livePhotoTapped(_ sender: UIButton) { 

    let videoConnection = stillImageOutput?.connection(with: .video) 

    //capture still image async 
    stillImageOutput?.captureStillImageAsynchronously(from: videoConnection!, completionHandler: { (imageDataBuffer, error) in 

     if let imageData = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: imageDataBuffer!, previewPhotoSampleBuffer: imageDataBuffer!) { 

      self.stillImage = UIImage(data: imageData) 
      self.performSegue(withIdentifier: "toPreviewPhoto", sender: self) 
     } 

    }) 
} 
+0

Votre 'imageDataBuffer' est vide? Ajoutez 'print (imageDataBuffer)' avant que 'si let imageData = ...' et voyez s'il est nul – 3stud1ant3

+0

Où vous appelez 'setupCaptureSessionCamera'? –

Répondre

0

Utilisez comme ceci:

pour CMSampleBufferIsValid vérifier ce link

@IBAction func livePhotoTapped(_ sender: UIButton) { 

    let videoConnection = stillImageOutput?.connection(with: .video) 

    //capture still image async 
    stillImageOutput?.captureStillImageAsynchronously(from: videoConnection!, completionHandler: { (imageDataBuffer, error) in 

     if error != nil { 
      print("error \(error)") 
     } else { 
      if let imageBuffer = imageDataBuffer, CMSampleBufferIsValid(imageBuffer) { 
       if let imageData = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: imageDataBuffer!, previewPhotoSampleBuffer: imageDataBuffer!) { 

        self.stillImage = UIImage(data: imageData) 
        self.performSegue(withIdentifier: "toPreviewPhoto", sender: self) 
       }  
      } else { 
       print("imageDataBuffer is nil or not valid") 
      } 
     } 
    }) 
} 
0

Vous forcez le déballage d'un objet nul.

var currentDevice: AVCaptureDevice? 

On dirait que cette méthode a été désapprouvée:

+ (NSArray<AVCaptureDevice *> *)devices NS_DEPRECATED(10_7, NA, 4_0, 10_0, "Use AVCaptureDeviceDiscoverySession instead."); 

Avez-vous essayé "AVCaptureDeviceDiscoverySession"?