Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios AVF基础错误代码_Ios_Swift_Error Handling_Avfoundation_Avcapturephotosettings - Fatal编程技术网

Ios AVF基础错误代码

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“(空)”

我在拍摄原始照片和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中的此函数之后:

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)
    }

}
笔记
  • 苹果公司的AVCam示例代码被密切关注
  • 只有在一次更成功的照片捕获后,才会发生此崩溃。生成的原始文件非常好

  • 更新

    在图像捕获完成之前,您正在调用导致错误的
    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