2017-05-01 10 views
2

私はAVFoundationを使用して写真を撮ったり保存したりする方法を学ぼうとしています。私は現在、写真を撮るためのアクションにリンクされたボタンを備えたカスタムカメラビューを作成することができました。ボタンをクリックすると、デリゲートメソッドが呼び出されていません。didFinishProcessingPhotoSampleBufferがコールしていません

class ViewController: UIViewController, AVCapturePhotoCaptureDelegate{ 

    @IBOutlet weak var camerView: UIView! 
    @IBOutlet weak var photoButton: UIButton! 

    var captureSession : AVCaptureSession? 
    var sessionOutput : AVCapturePhotoOutput? 
    var previewLayer : AVCaptureVideoPreviewLayer? 

    var photoSettings : AVCapturePhotoSettings? 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 
     previewLayer?.frame = (self.camerView?.bounds)! 
     previewLayer?.position = CGPoint(x: (self.camerView?.frame.width)!/2, y: (self.camerView?.frame.height)!/2) 

    } 

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

     //Capture Session 
     captureSession = AVCaptureSession() 

     let devices = AVCaptureDeviceDiscoverySession(deviceTypes: [.builtInDualCamera], mediaType: AVMediaTypeVideo, position: .back) 

     for device in (devices?.devices)! { 

      do { 
       let input = try AVCaptureDeviceInput(device: device) 

       if (captureSession?.canAddInput(input))! { 
        captureSession?.addInput(input) 
       } 
       if (captureSession?.canAddOutput(sessionOutput))! { 
        captureSession?.addOutput(sessionOutput) 
       } 

       previewLayer = AVCaptureVideoPreviewLayer() 

       previewLayer?.session = captureSession 

       self.camerView.layer.addSublayer(previewLayer!) 
       self.camerView.addSubview(photoButton) 

       captureSession?.startRunning() 

      } catch { 
       print("error occurred") 
      } 

     } 


    } 

    @IBAction func takePhoto(_ sender: UIButton) { 

     photoSettings = AVCapturePhotoSettings(format: [AVVideoCodecKey : AVVideoCodecJPEG]) 
     photoSettings?.flashMode = .on 
     sessionOutput?.capturePhoto(with: photoSettings!, delegate: self) 


    } 


    //AVCapturePhotoCaptureDelegate Functions 

    func capture(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?, previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) { 
     print("PhotoSampleBuffer") 
    } 




} 

私はdidFinisheProcessingPhotoSampleBuffer方法でやろうとしていますすべてを印刷するだけである()ので、私はそれが呼び出されている知っている:

は、ここに私のViewController.swiftです。私は後で保存する方法を見つけ出すでしょう(誰かが私にこのことを知るために良いresoureを指摘しない限り)。

他の情報が必要な場合は教えてください!

答えて

1

のメソッド(したがってデリゲートコールバック)は、変数がnilであるため呼び出されていません。それが宣言されたときに

これを修正するには、sessionOutput変数をインスタンス化します。それはもはやオプションであるため

var sessionOutput = AVCapturePhotoOutput() 

また、あなたがsessionOutput?を削除する必要がないでしょう。

関連する問題