【问题标题】:Can't use AVCaptureDevice with a flash无法将 AVCaptureDevice 与闪光灯一起使用
【发布时间】:2016-03-19 03:12:56
【问题描述】:

我遇到了困难,因为我认为应该很简单。 我只想在我的 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 块内的 2 行移到末尾,或者从不同点调用包含此代码的函数。但在所有情况下运行时:

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()

【问题讨论】:

    标签: ios swift2 avfoundation avcapturesession avcapturedevice


    【解决方案1】:

    万一其他人遇到同样的问题(我不能认为我是唯一一个不走运的人!)。

    这是我最终找到的解决方案:

    似乎这两条指令中,第一个必须先运行(如果需要,欢迎任何 AVFoundation 专家进一步制作 cmet):

    stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection)
    captureSession.stopRunning()
    

    而且闪光的事实使顺序有些随机。 为了解决这个问题,我将第二条指令带入了第一条指令的完成块中,这样做确保顺序始终相同。

    然后我可以使用:

    captureDevice.flashMode = .On // or .Off or .Auto
    

    一切正常。

    请注意,这是设置闪光灯使用模式的代码,而不是每次闪光时触发的代码(如本文开头所建议的那样)。

    【讨论】:

      【解决方案2】:

      我注意到,配置AVCaptureDevice,而AVCaptureSession 包含AVCaptureDeviceInput 引用导致此错误。我的解决方案是:在配置AVCaptureDevice 对象之前,删除AVCaptureSession 中的AVCaptureDeviceInput 引用并在完成时阅读它。我不会再用这种方法得到错误。 示例:

      self.input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:&error];
      

      。 .

      [self.session removeInput:self.input];
      if ([device lockForConfiguration:NULL]) {
         device.focusMode = AVCaptureFocusModeContinuousAutoFocus;
         [device unlockForConfiguration];
      }
      [self.session addInput:self.input];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-27
        • 1970-01-01
        • 2014-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多