打开手电筒时 AVCaptureSession 冻结

sul*_*y77 5 iphone ios swift ios11.4

我们的 iOS 应用程序中有条码扫描功能,我们让客户能够根据需要打开和关闭手电筒。在 iPhone X 上(仅在 iPhone X 上),当 AvCaptureSession 正在运行并启用手电筒时,屏幕上的视频捕获会冻结。一旦手电筒再次关闭,视频捕捉将再次开始。有没有人遇到过这个?我似乎找不到任何指向解决方法的东西。想知道这是否是 iPhone X 的错误?

sma*_*kus 7

我遇到了这个问题。经过一些实验,结果证明获取配置 Torch 的设备的方式与配置 AVCaptureSession 时获取设备的方式完全相同。例如:

    let captureSession = AVCaptureSession()
    let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInDualCamera], mediaType: AVMediaType.video, position: .back)

        guard let captureDevice = deviceDiscoverySession.devices.first else {
            print("Couldn't get a camera")
            return
        }
     do {
            let input = try AVCaptureDeviceInput(device: captureDevice)
            captureSession!.addInput(input)
        } catch {
            print(error)
            return
        }
Run Code Online (Sandbox Code Playgroud)

在打开和关闭手电筒(手电筒)时,使用该确切方法获取设备。在这种情况下,这些行:

let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInDualCamera], mediaType: AVMediaType.video, position: .back)

guard let device = deviceDiscoverySession.devices.first
Run Code Online (Sandbox Code Playgroud)

例子:

func toggleTorch() {

    let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInDualCamera], mediaType: AVMediaType.video, position: .back)

    guard let device = deviceDiscoverySession.devices.first
        else {return}

    if device.hasTorch {
        do {
            try device.lockForConfiguration()
            let on = device.isTorchActive
            if on != true && device.isTorchModeSupported(.on) {
                try device.setTorchModeOn(level: 1.0)
            } else if device.isTorchModeSupported(.off){
                device.torchMode = .off
            } else {
                print("Torch mode is not supported")
            }
            device.unlockForConfiguration()
        } catch {
            print("Torch could not be used")
        }
    } else {
        print("Torch is not available")
    }
}
Run Code Online (Sandbox Code Playgroud)

我意识到 toggleTorch 函数中的某些代码可能是多余的,但我要离开它。希望这可以帮助。

  • 通过“AVCaptureDevice.userPreferredCamera”获取设备似乎可以在 iOS 17 上使用。 (2认同)