Swift 3照片捕捉

时间:2016-09-14 13:57:07

标签: ios swift swift3

我正在使用这段代码:

func capturePhoto(blockCompletion: @escaping blockCompletionCapturePhoto) {
    guard let connectionVideo  = self.stillCameraOutput.connection(withMediaType: AVMediaTypeVideo) else {
        blockCompletion(nil, nil)
        return
    }

    connectionVideo.videoOrientation = AVCaptureVideoOrientation.orientationFromUIDeviceOrientation(orientation: UIDevice.current.orientation)

    self.stillCameraOutput.captureStillImageAsynchronouslyFromConnection(connectionVideo) { (sampleBuffer: CMSampleBuffer!, err: NSError!) -> Void in
        if let err = err {
            blockCompletion(image: nil, error: err)
        }
        else {
            if let sampleBuffer = sampleBuffer, let dataImage = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer) {
                let image = UIImage(data: dataImage)
                blockCompletion(image: image, error: nil)
            }
            else {
                blockCompletion(image: nil, error: nil)
            }
        }
    }
}

它在Swift 2.0中运行良好,但转换后它不再起作用了。 这一行:

self.stillCameraOutput.captureStillImageAsynchronouslyFromConnection(connectionVideo) { (sampleBuffer: CMSampleBuffer!, err: NSError!) -> Void in 

给我以下错误:

  

无法转换类型的值'(CMSampleBuffer!,NSError!) - > Void'到预期的参数类型'((CMSampleBuffer?,错误?) - > Void)!'

我已经尝试了一些东西,但无法解决问题。 希望有人可以帮助我。

2 个答案:

答案 0 :(得分:3)

错误是什么

  

无法转换类型'(CMSampleBuffer!,NSError!)的值 - >虚空'预期的参数类型'((CMSampleBuffer?,错误?) - > Void)!'

基本上说是你的参数类型错误((CMSampleBuffer!, NSError!) -> Void),而它的类型应该是((CMSampleBuffer?, Error?) -> Void)!

要实现这一点,请尝试使用此代码,它应该自动使您的块符合正确的类型:

self.stillCameraOutput.captureStillImageAsynchronouslyFromConnection(connectionVideo) { sampleBuffer, error in
    //do stuff with your sample buffer, don't forget to handle errors
}

它看起来像一个奇怪的类型但我认为这是一个小错误Apple在将此代码从ObjC迁移到Swift 1到Swift 2到Swift 3时所做的某些地方。
我还没有测试过这段代码,但我觉得它应该有用,让我知道它是否确实如此!

答案 1 :(得分:2)

在swift 3中,命令改变了!

从:

captureStillImageAsynchronouslyFromConnection

为:

captureStillImageAsynchronously

所以试试这段代码:

self.stillCameraOutput?.captureStillImageAsynchronously(from: connectionVideo, completionHandler: {
         (sampleBuffer, error) in
  // do your stuff here
}