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
相关产品推荐
相关产品推荐

