我在使用这段代码:
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)
}
}
}
}它在SWIFT2.0中运行得很好,但是在转换之后就不再工作了。这一行:
self.stillCameraOutput.captureStillImageAsynchronouslyFromConnection(connectionVideo) { (sampleBuffer: CMSampleBuffer!, err: NSError!) -> Void in 给出了以下错误:
无法将类型'(CMSampleBuffer!,NSError!) -> Void‘转换为预期的参数类型((CMSampleBuffer?,错误?) -> Void)!’
我已经试过一些东西了,但没能解决。希望有人能帮我。
发布于 2016-09-14 15:04:03
什么错误
无法将类型'(CMSampleBuffer!,NSError!) -> Void‘转换为预期的参数类型((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
}这看起来是一种奇怪的类型,但我认为这是苹果在将这段代码从ObjC迁移到Swift 1到Swift 2到Swift 3时所犯的一个小错误。
我还没有测试过这段代码,但我认为它应该能工作,让我知道它是否真的成功了!
发布于 2016-09-15 18:52:12
在第三次行动中,这个命令改变了!
发自:
captureStillImageAsynchronouslyFromConnection至:
captureStillImageAsynchronously所以,试试下面的代码:
self.stillCameraOutput?.captureStillImageAsynchronously(from: connectionVideo, completionHandler: {
(sampleBuffer, error) in
// do your stuff here
}https://stackoverflow.com/questions/39492339
复制相似问题