ios - 不能将 AVCaptureDevice 与闪光灯一起使用

标签 ios swift2 avfoundation avcapturesession avcapturedevice

我遇到了困难,因为一些我认为应该很简单的事情。 我只想在我的 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/

相关文章:

iphone - 使用 pushViewController 进行内存管理

ios - 将对象解析为 AnnonationPoints

ios - 获取uitableview的多个选定行信息

Swift:符合协议(protocol)的AnyClass变量

ios6 - 改变 AVCaptureVideoPreviewLayer 方向的问题

ios - swift : take photo from AVFoundation

ios - 如何在不破坏 MVVM 模式的情况下处理 Alamofire 的结果

ios - prefersStatusBarHidden,Swift 3 中的 preferredStatusBarStyle 属性

swift - 返回一个具有关联值的枚举,其中需要 AnyObject

swift - 样本缓冲区的媒体类型必须匹配接收方的媒体类型 ("soun")