You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift AVFoundation摄像头切换函数需点击两次才生效,求排查

iOS摄像头切换需点击两次的问题与修复

编写的前后摄像头切换函数存在异常:点击切换按钮时,需要连续点击两次才能真正完成摄像头切换,单次点击无法触发预期效果。

原函数代码

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) // 新输入添加失败时重新添加旧输入
        }
    } catch {
        print("Error creating new camera input: \(error)")
        session.addInput(currentVideoInput) // 出错时重新添加旧输入
    }

    session.commitConfiguration()
}

问题原因

原代码仅移除session.inputs中的第一个视频输入,但如果AVCaptureSession中存在多个残留的视频输入(比如之前切换操作未彻底清理),第一次点击时仅移除了其中一个旧输入,新添加的视频输入会和剩余的旧输入共存,此时session可能仍优先使用旧输入,导致视觉上未完成切换;第二次点击时才会移除剩下的旧输入,新输入才会生效。

修复后的代码(替换原移除输入的逻辑)

将原代码中session.removeInput(currentVideoInput)的部分替换为以下代码,确保移除所有非音频类型的输入,彻底清理残留的视频输入:

session.inputs.forEach { input in
    if let deviceInput = input as? AVCaptureDeviceInput {
        let device = deviceInput.device
        
        if !device.hasMediaType(.audio) {
            session.removeInput(input)
        }
    }
}

内容的提问来源于stack exchange,提问作者Ahmed Zaidan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 18:02:42