首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVFoundation错误码

AVFoundation错误码
EN

Stack Overflow用户
提问于 2018-05-02 14:36:20
回答 1查看 2.1K关注 0票数 2

我得到以下两条错误信息时,采取原始和JPEG照片。我无法诊断这些:

错误捕获照片:错误域=AVFoundationError-域代码=-11800“操作无法完成”Userlnfo={NSLocalizedFailur- eReason=An未知错误发生(42686),NSLocalizedDescription:操作无法完成,NSUnderlyingEr- ror=0x1c804bfa0 {错误域=NSOSStatusError-域代码=-12686“(Null)}

还有..。

错误捕获照片:错误域=AVFoundationError-域代码=-11800操作无法完成“UserInfo。{NSOSStatusError=一个未知错误(-16802),NSLocalizedDescription=The操作无法完成,NSUnderlyingEr-ror=0x1c4243f30 {Error域=NSOSStatusError域代码=-16802”(Null)}}

这似乎就发生在AVCapturePhotoCaptureDelegate中的这个函数之后。

代码语言:javascript
复制
optional func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?)  

这似乎是在重复拍摄照片时随机发生的。

更新

原始设置

代码语言:javascript
复制
       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])

}

捕获呼叫:

代码语言:javascript
复制
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()
            }
        }
    }

照片捕获代表

代码语言:javascript
复制
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)
    }

}

备注

  1. 苹果的AVCam示例代码受到了密切关注。
  2. 这次坠机只有在一张更成功的照片拍摄之后才会发生。生成的原始文件非常好。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-06 07:19:58

更新

在图像捕获完成之前调用updatePhotoSettings(),这将导致错误。尝试从完成处理程序或在您拍摄图像之前完成它。

附注:实际上,AVFoundation应该让这个错误更难犯,或者至少更清楚地知道这是行不通的。

以前,不正确地猜测

您没有展示如何配置AVCaptureSession (这一点很重要),但是

  1. 如果启用了AVCapturePhotoSettings isHighResolutionPhotoEnabled,还需要启用isHighResolutionCaptureEnabled (可能是highResolutionCaptureEnabled --您使用的是什么版本的isHighResolutionCaptureEnabled?): self.photoOutput.isHighResolutionCaptureEnabled =真
  2. 您的PhotoCaptureDelegate看起来超出了范围,这将于事无补。将其分配给成员变量以延长其寿命。
  3. 在您的.photo上设置AVCaptureSession预置
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50137282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档