我现在的日子很不好过,因为我觉得有些事情应该很简单。我只是想在iOS应用程序中拍照时点亮闪光灯。但我所有的尝试都失败了,或者只有20%的效果。
以下是用于点亮闪光灯的代码:
// Here we have: captureDevice.hasFlash && captureDevice.isFlashModeSupported(.On)
do {try captureDevice.lockForConfiguration()
captureDevice.flashMode = .On
captureDevice.unlockForConfiguration()
} catch let error as NSError {
print("captureDevice.lockForConfiguration FAILED")
print(error.code)
}
我已经尝试了几种不同的代码风格,比如将try代码块中的两行移到末尾,或者从不同的位置调用包含这段代码的函数。但是在运行这段代码时,无论是哪种情况:
stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection) {
(imageDataSampleBuffer, error) -> Void in
出现以下错误:
Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSUnderlyingError=0x13f079340 {Error Domain=NSOSStatusErrorDomain Code=-16800 "(null)"}, NSLocalizedFailureReason=An unknown error occurred (-16800), NSLocalizedDescription=The operation could not be completed}
如果我接着替换行:
captureDevice.flashMode = .On
签署人:
captureDevice.torchMode = .On
我得到的东西或多或少的工作(不幸的是相当少),没有错误,但这是使用 Torch ,所以我得到的时间问题:
此外,我不清楚是否需要在代码中的某个位置使用此行:
captureSession.commitConfiguration()
2条答案
按热度按时间tpgth1q71#
以防其他人遇到同样的问题(我不认为我是唯一一个不幸的人!)
下面是我最终找到的解决方案:
在这两条指令中,第一条指令似乎必须首先运行(如果需要,欢迎任何AVFoundationMaven提出进一步的意见):
闪光灯的启动使得顺序有些随机,为了解决这个问题,我把第二条指令放在了第一条指令的完成块中,这样做可以确保顺序总是相同的。
那我就用途:
一切都很顺利。
请注意,这是设置闪光灯使用的模式的代码,而不是在每次闪光灯点亮时触发的代码(如本文开头所建议的)。
qij5mzcb2#
我注意到,配置
AVCaptureDevice
时,AVCaptureSession
包含了一个AVCaptureDeviceInput
引用,导致了这个错误。我的解决方案是:在配置AVCaptureDevice
对象之前,删除AVCaptureSession
中的AVCaptureDeviceInput
引用,并在完成时读取它。使用此方法,我将不再收到错误。示例: