swift2 无法将AVCaptureDevice与闪光灯一起使用

s71maibg  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(182)

我现在的日子很不好过,因为我觉得有些事情应该很简单。我只是想在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()
tpgth1q7

tpgth1q71#

以防其他人遇到同样的问题(我不认为我是唯一一个不幸的人!)
下面是我最终找到的解决方案:
在这两条指令中,第一条指令似乎必须首先运行(如果需要,欢迎任何AVFoundationMaven提出进一步的意见):

stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection)
captureSession.stopRunning()

闪光灯的启动使得顺序有些随机,为了解决这个问题,我把第二条指令放在了第一条指令的完成块中,这样做可以确保顺序总是相同的。
那我就用途:

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

一切都很顺利。
请注意,这是设置闪光灯使用的模式的代码,而不是在每次闪光灯点亮时触发的代码(如本文开头所建议的)。

qij5mzcb

qij5mzcb2#

我注意到,配置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];

相关问题