Swift AVFoundation 翻转相机功能不起作用

问题描述 投票:0回答:1

我有一个功能可以在前置摄像头和后置摄像头之间切换。下面的这个函数可以工作,但是我必须单击一个按钮两次来调用这个函数,相机才能真正翻转。我尝试调试问题,但无法弄清楚为什么翻转只能在第二次尝试时起作用。我不太清楚为什么会话会这样。

    func flipCamera() {
        guard let currentVideoInput = session.inputs.first as? AVCaptureDeviceInput else {
            return
        }

        session.beginConfiguration()
        session.removeInput(currentVideoInput)

        let newCameraPosition: AVCaptureDevice.Position = (currentCameraPosition == .back) ? .front : .back
        guard let newCamera = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: newCameraPosition) else {
            session.commitConfiguration()
            return
        }

        do {
            let newVideoInput = try AVCaptureDeviceInput(device: newCamera)

            if session.canAddInput(newVideoInput) {
                session.addInput(newVideoInput)
                currentCameraPosition = newCameraPosition
            } else {
                session.addInput(currentVideoInput) // Re-add the old input if new input fails
            }
        } catch {
            print("Error creating new camera input: \(error)")
            session.addInput(currentVideoInput) // Re-add the old input in case of error
        }

        session.commitConfiguration()
    }
ios swift avfoundation
1个回答
0
投票

您可能需要在尝试切换相机之前更新

currentCameraPosition
,如此处所示

func flipCamera() {
    guard let currentVideoInput = session.inputs.first as? AVCaptureDeviceInput else {
        return
    }

    // Update the currentCameraPosition first
    currentCameraPosition = (currentCameraPosition == .back) ? .front : .back

    session.beginConfiguration()
    session.removeInput(currentVideoInput)

    guard let newCamera = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: currentCameraPosition) else {
        session.commitConfiguration()
        return
    }

    do {
        let newVideoInput = try AVCaptureDeviceInput(device: newCamera)

        if session.canAddInput(newVideoInput) {
            session.addInput(newVideoInput)
        } else {
            // Revert the camera position if new input fails
            currentCameraPosition = (currentCameraPosition == .back) ? .front : .back
            session.addInput(currentVideoInput) // Re-add the old input
        }
    } catch {
        print("Error creating new camera input: \(error)")
        // Revert the camera position in case of error
        currentCameraPosition = (currentCameraPosition == .back) ? .front : .back
        session.addInput(currentVideoInput) // Re-add the old input
    }

    session.commitConfiguration()
}

currentCameraPosition
在方法开始时更新。如果添加新输入失败或发生错误,
currentCameraPosition
将恢复到之前的状态。

© www.soinside.com 2019 - 2024. All rights reserved.