我遇到了困难,因为一些我认为应该很简单的事情。 我只想在我的 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 block 内的两行移到末尾,或者从不同的点调用包含此代码的函数。但在所有情况下,在运行时:
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
我得到了或多或少的工作(不幸的是更少),没有错误,但这是使用手电筒,所以我遇到了时间问题:
也不清楚我是否需要在我的代码中的某个点使用这一行:
captureSession.commitConfiguration()
最佳答案
以防其他人遇到同样的问题(我不认为我是唯一一个倒霉的人!)。
这是我最终找到的解决方案:
看来这两个指令中,第一个必须先运行(如果需要,欢迎任何AVFoundation专家进一步评论):
stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection)
captureSession.stopRunning()
而且闪光灯的闪光使得顺序有些随机。 为了解决这个问题,我将第二条指令放入了第一条指令的完成 block 中,这样做可确保顺序始终相同。
然后我可以使用:
captureDevice.flashMode = .On // or .Off or .Auto
一切正常。
请注意,它是设置闪光灯使用模式的代码,而不是每次闪光时触发的代码(如本文开头所建议的)。
关于ios - 不能将 AVCaptureDevice 与闪光灯一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36097389/