Ios AVF基础错误代码
我在拍摄原始照片和JPEG照片时收到以下两条错误消息。我无法诊断这些: 捕获照片时出错:错误域=AVFoundationError-域 代码=-11800“操作无法完成” Userlnfo={NSLocalizedFailur-eReason=发生未知错误(42686), NSLocalizedDescription:无法完成该操作, NSUnderlyingEr-ror=0x1c804bfa0{Error Domain=NSOSStatusError-Domain 代码=-12686“(空)”} 还有 捕获照片时出错:错误域=AVFoundationError域 代码=-11800操作无法完成“ UserInfo.{NSLocalized FailureReason=发生未知错误 (-16802),NSLocalizedDescription=操作无法完成, NSUnderlyingEr ror=0x1c4243f30{错误域=NSOSStatusError域 代码=-16802“(空)”} 这似乎发生在AVCapturePhotoCaptureDelegate中的此函数之后:Ios AVF基础错误代码,ios,swift,error-handling,avfoundation,avcapturephotosettings,Ios,Swift,Error Handling,Avfoundation,Avcapturephotosettings,我在拍摄原始照片和JPEG照片时收到以下两条错误消息。我无法诊断这些: 捕获照片时出错:错误域=AVFoundationError-域 代码=-11800“操作无法完成” Userlnfo={NSLocalizedFailur-eReason=发生未知错误(42686), NSLocalizedDescription:无法完成该操作, NSUnderlyingEr-ror=0x1c804bfa0{Error Domain=NSOSStatusError-Domain 代码=-12686“(空)”
optional func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?)
这些似乎是在重复拍摄照片时随机发生的
更新 原始设置
func updatePhotoSettings () {
self.photoOutput.setPreparedPhotoSettingsArray([])
let newPhotoSettings = AVCapturePhotoSettings(rawPixelFormatType: OSType(self.photoOutput.availableRawPhotoPixelFormatTypes.first!),
processedFormat: [AVVideoCodecKey : AVVideoCodecJPEG])
newPhotoSettings.previewPhotoFormat = [kCVPixelBufferPixelFormatTypeKey as String: self.photoOutput.availablePhotoPixelFormatTypes[0]]
if #available(iOS 11.0, *) {
newPhotoSettings.embeddedThumbnailPhotoFormat = [AVVideoCodecKey: self.photoOutput.availablePhotoCodecTypes[0]]
}
newPhotoSettings.isHighResolutionPhotoEnabled = true
newPhotoSettings.flashMode = self.flashMode
newPhotoSettings.isAutoStillImageStabilizationEnabled = false
newPhotoSettings.livePhotoMovieFileURL = nil
self.photoOutput.photoSettingsForSceneMonitoring = newPhotoSettings
self.photoOutput.setPreparedPhotoSettingsArray([newPhotoSettings])
}
捕获呼叫:
final func snapImage () {
let photoCaptureDelegate = PhotoCaptureDelegate(with: self.photoOutput.preparedPhotoSettingsArray.first!,
willCapturePhotoAnimation: {
//Shutter animation
DispatchQueue.main.async { [unowned self] in
self.previewView.videoPreviewLayer.opacity = 0
UIView.animate(withDuration: 0.1, animations: {
self.previewView.videoPreviewLayer.opacity = 1
})
}
}, didCapturePhoto: {
//Photo Saved animation
}, completed: { [unowned self] photoCaptureDelegate in
self.inProgressPhotoCaptureDelegates[photoCaptureDelegate.requestedPhotoSettings.uniqueID] = nil
})
self.inProgressPhotoCaptureDelegates[photoCaptureDelegate.requestedPhotoSettings.uniqueID] = photoCaptureDelegate
self.photoOutput.capturePhoto(with: self.photoOutput.preparedPhotoSettingsArray.first!, delegate: photoCaptureDelegate)
DispatchQueue.main.async {
//Goes to update photo settings for next shot
self.updatePhotoSettings()
}
}
}
照片捕获代表
import AVFoundation
import Photos
import MobileCoreServices
class PhotoCaptureDelegate: NSObject, AVCapturePhotoCaptureDelegate {
private(set) var requestedPhotoSettings : AVCapturePhotoSettings
private let willCapturePhotoAnimation : () -> ()
private let didCapturePhoto : () -> ()
private let completed : (PhotoCaptureDelegate) -> ()
private var jpegPhotoData : Data?
private var dngPhotoData : Data?
// MARK: - Initialization
init(with requestedPhotoSettings: AVCapturePhotoSettings,
willCapturePhotoAnimation: @escaping () -> (),
didCapturePhoto: @escaping () -> (),
completed: @escaping (PhotoCaptureDelegate) -> ())
{
self.requestedPhotoSettings = requestedPhotoSettings
self.willCapturePhotoAnimation = willCapturePhotoAnimation
self.didCapturePhoto = didCapturePhoto
self.completed = completed
}
private final func didFinish() {
self.completed(self)
}
// MARK: - Will Capture
final func capture(_ captureOutput: AVCapturePhotoOutput, willCapturePhotoForResolvedSettings resolvedSettings: AVCaptureResolvedPhotoSettings) {
willCapturePhotoAnimation()
}
final func capture(_ output: AVCapturePhotoOutput, willBeginCaptureForResolvedSettings resolvedSettings: AVCaptureResolvedPhotoSettings) {
}
// MARK: - iOS 11 Did Finish Photo
@available(iOS 11.0, *)
final func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
if let error = error {
PhotoCaptureDelegate.showError(sentMessage: "Error processing photo: \(error)")
self.didCapturePhoto()
} else {
if photo.isRawPhoto {
self.dngPhotoData = photo.fileDataRepresentation()
return
} else {
if self.jpegPhotoData == nil {
self.jpegPhotoData = photo.fileDataRepresentation()
self.didCapturePhoto()
return
}
}
}
}
// MARK: - Did Finish Capture
final func capture(_ captureOutput: AVCapturePhotoOutput, didFinishCaptureForResolvedSettings resolvedSettings: AVCaptureResolvedPhotoSettings, error: Error?) {
if let error = error {
PhotoCaptureDelegate.showError(sentMessage: "Error capturing photo: \(error)")
didFinish()
return
if PHPhotoLibrary.authorizationStatus() == .authorized {
var temporaryDNGFileURL : URL? = nil
self.dngPhotoData != nil {
temporaryDNGFileURL = URL(fileURLWithPath: NSTemporaryDirectory().appending("\(resolvedSettings.uniqueID).dng"))
do {
try self.dngPhotoData!.write(to: temporaryDNGFileURL!, options: [.atomic])
} catch let error as NSError {
PhotoCaptureDelegate.showError(sentMessage: "Could not write DNG Data: \(error)")
return
}
}
PHPhotoLibrary.shared().performChanges({
let creationRequest = PHAssetCreationRequest.forAsset()
if (self.jpegPhotoData != nil) {
creationRequest.addResource(with: .photo, data: self.jpegPhotoData!, options: nil)
if let temporaryDNGFileURL = temporaryDNGFileURL {
let companionDNGResourceOptions = PHAssetResourceCreationOptions()
companionDNGResourceOptions.shouldMoveFile = true
creationRequest.addResource(with: .alternatePhoto, fileURL: temporaryDNGFileURL, options: companionDNGResourceOptions)
}
}
}, completionHandler: { [unowned self] success, error in
if let error = error {
PhotoCaptureDelegate.showError(sentMessage: "Error occurered while saving photo to photo library: \(error)")
}
if (temporaryDNGFileURL != nil) {
if FileManager.default.fileExists(atPath: temporaryDNGFileURL!.path) {
do {
try FileManager.default.removeItem(at: temporaryDNGFileURL!)
} catch let error as NSError {
PhotoCaptureDelegate.showError(sentMessage: "Could not remove DNG File: \(error)")
}
}
}
})
}
else {
PhotoCaptureDelegate.showError(sentMessage: "Not authorized to save photo")
self.didFinish()
return
}
}
private static func showError (sentMessage: String) {
let alertController = UIAlertController(title: nil, message: sentMessage, preferredStyle: UIAlertControllerStyle.alert)
let cancelAction = UIAlertAction(title: NSLocalizedString("OK", comment: "Alert button title."), style: UIAlertActionStyle.cancel, handler: nil)
alertController.addAction(cancelAction)
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window!.rootViewController!.present(alertController, animated: true, completion: nil)
}
}
笔记
更新 在图像捕获完成之前,您正在调用导致错误的
updatePhotoSettings()
。请尝试从完成处理程序或在捕捉图像之前执行此操作
p、 美国真的应该让这个错误更难犯,或者至少更清楚地表明这是行不通的
之前的错误猜测
您不会显示如何配置重要的AVCaptureSession
,但是
AVCapturePhotoSettings
isHighResolutionPhotoEnabled
,则还需要启用isHighResolutionCaptureEnabled
(可能为您启用了highResolutionCaptureEnabled
,您使用的是哪个版本的swift?)
PhotoCaptureDelegate
看起来好像超出了作用域,这不会有帮助。请将其分配给成员变量以延长其寿命AVCaptureSession
你能展示设置捕获会话并拍摄照片的代码吗?更新了原始帖子。1.我在设置会话时确实启用了self.photoOutput.ishighrosolutioncapturenabled=true。2.这似乎很有趣。如果这样做,这将违背苹果的示例代码。但会尝试。所以只有一个弱引用吗?3.我没有e.AVCaptureSession预设的photo。这是什么样的示例代码?我认为您需要显示更多的代码,如会话配置和重复捕获的方式-根据您所显示的内容,调用
snapImage()
两次会导致异常,并显示消息“[AVCapturePhotoOutput capturePhotoWithSettings:delegate:]设置可能无法重复使用”。对于重复捕获,会重复调用snapImage()。在snapImage()的末尾,会调用updatePhotoSettings(),以便为下一次拍摄准备照片设置。我消除了这个问题。photoOutput.setPreparedPhotoSettingsArray()是一个问题,因为如果我将其取出并在snapImage中进行设置()就在捕获之前,同样的问题仍然存在。问题可能是您正在调用updatePhotoSettings()
在图像捕获完成之前?在忙时重新配置AVCapturePhotoOutput
听起来可能会导致意外错误。完成-我现在还看到您的代理的范围在inProgressPhotoCaptureDelegates
中扩展。
self.photoOutput.isHighResolutionCaptureEnabled = true