使用 AVCapturePhotoOutput 使用闪光灯拍照时出现问题

Posted

技术标签:

【中文标题】使用 AVCapturePhotoOutput 使用闪光灯拍照时出现问题【英文标题】:issue while taking photo wtth flash On using AVCapturePhotoOutput 【发布时间】:2017-06-05 13:40:37 【问题描述】:

我正在开发相机应用程序。我将 AVCapturePhotoOutput 用于 ios 10.x 设备,将 AVCaptureStillImageOutput 用于 10.x 以下设备。

我在拍摄照片时使用以下拍摄设置

let settings = AVCapturePhotoSettings()

let previewPixelType = settings.availablePreviewPhotoPixelFormatTypes.first!
        let previewFormat = [kCVPixelBufferPixelFormatTypeKey as String: previewPixelType,
                             kCVPixelBufferWidthKey as String: 1080,
                             kCVPixelBufferHeightKey as String: 1080,
                             ]
settings.previewPhotoFormat = previewFormat
settings.isHighResolutionPhotoEnabled = true
settings.flashMode = .on
settings.isAutoStillImageStabilizationEnabled = true
self.captureOutputPhoto?.capturePhoto(with: settings, delegate: self)

当我尝试使用上述设置拍摄照片时

captureOutput:didFinishProcessingPhotoSampleBuffer:previewPhotoSampleBuffer:resolvedSettings:bracketSettings:error

上面的委托第一次抛出错误。我是 AVCapturePhotoSettings 的初学者。每次使用闪光灯模式成功拍摄照片后都会出现此问题。

【问题讨论】:

你能复制并粘贴你得到的错误信息吗? 我遇到了同样的错误。错误代码 -16005 错误描述:操作无法完成。当 flashmode 设置为 On 时,每次成功捕获图像后都会出现此错误 @Dhaval 你想用另一个类来用闪光灯捕捉图像吗? 我使用 AVCapturePhotoOutput for iOS 10.x 和 AVCaptureStillImageOutput。 AVCaptureStillImageOutput 适用于 10.x 以下的设备。 ios 10.x 设备中的 AVCapturePhotoOutput 出现问题。 AVCaptureStillImageOutput 现已弃用。 在预览层停止渲染后使用 Flash 捕获时出现以下错误 :: (Error Domain=AVFoundationErrorDomain Code=-11800 \"无法完成操作\" UserInfo=NSUnderlyingError=0x174652060 Error Domain=NSOSStatusErrorDomain Code=-16800 \"(null)\", NSLocalizedFailureReason=发生未知错误 (-16800), NSLocalizedDescription=操作无法完成) 【参考方案1】:

来自Apple documentation:

如果闪光灯模式为 在 . (启用闪光灯优先于 isAutoStillImageStabilizationEnabled 设置。)

不确定,如果它应该抛出错误,但你可以尝试删除这个字符串

settings.isAutoStillImageStabilizationEnabled = true

【讨论】:

通过评论 settings.isAutoStillImageStabilizationEnabled = true 这一行进行检查。仍然面临同样的问题。【参考方案2】:

captureOutput:didFinishProcessingPhotoSampleBuffer:previewPhotoSampleBuffer:resolvedSettings:bracketSettings:error:,一个Objective-C委托方法,它的Swift版本是photoOutput(_:didFinishProcessingPhoto:previewPhoto:resolvedSettings:bracketSettings:error:),被弃用了。

改为实现 Swift 方法photoOutput(_:didFinishProcessingPhoto:error:)

【讨论】:

【参考方案3】:

我正在使用这种方法来处理闪光灯设置。 AVCaptureDevice 基本上是您正在使用的相机,AVCaptureFlashMode 是您要使用的闪光灯模式。

func changeFlashSettings(device: AVCaptureDevice, mode: AVCaptureFlashMode) 
    do 
        try device.lockForConfiguration()
        device.flashMode = mode
        device.unlockForConfiguration()
     catch 
        print("Change Flash Configuration Error: \(error)")
    

您可以通过此设置将闪光灯设置为onoffauto。希望这会有所帮助。

【讨论】:

此解决方案适用于 ios 10.x 之前的版本,现在 AVCaptureStillImageOutput 已弃用 即使 AVCaptureStillImageOutput 已被弃用,此方法仍可用于 iOS 10.x 版本。在发布答案之前,我已经在 iOS 版本为 10.3.2 的真实设备上测试了代码。

以上是关于使用 AVCapturePhotoOutput 使用闪光灯拍照时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS10 中使用 AVCapturePhotoOutput - NSGenericException

无法使用 AVCapturePhotoOutput 快速捕捉照片 + xcode

AVCapturePhotoOutput - Xcode 9 Beta 5 中的更改

swift AVCapturePhotoOutput capturePhoto 挂起预览

无法仅获取在 Swift 中显示相机(AVCapturePhotoOutput)的 UIView 的屏幕截图

为啥在 AVCapturePhotoOutput 上调用 .capturePhoto(with:,delegate:) 会导致崩溃