【问题标题】:Swift 3 photo capturingSwift 3 拍照
【发布时间】:2016-09-14 13:57:07
【问题描述】:

我正在使用这段代码:

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?, Error?) -> Void)!'

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

【问题讨论】:

  • 我认为 NSError 在 Swift 3 中被重命名为 Error。只需删除 NS 就可以了。你迁移你的代码了吗?如果它没有捕捉到那会很奇怪。

标签: ios swift swift3


【解决方案1】:

什么错误

无法将类型 '(CMSampleBuffer!, NSError!) -> Void' 的值转换为预期的参数类型 '((CMSampleBuffer?, Error?) -> 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 时在某个地方犯的一个小错误。
我没有测试过这段代码,但我认为它应该可以工作,让我知道它是否真的有效!

【讨论】:

  • 我可以确认这解决了 Swift 3 中的编译错误
【解决方案2】:

在 swift 3 中,该命令发生了变化!

来自:

captureStillImageAsynchronouslyFromConnection

到:

captureStillImageAsynchronously

所以试试这个代码:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    相关资源
    最近更新 更多