我有一个功能可以在前置摄像头和后置摄像头之间切换。下面的这个函数可以工作,但是我必须单击一个按钮两次来调用这个函数,相机才能真正翻转。我尝试调试问题,但无法弄清楚为什么翻转只能在第二次尝试时起作用。我不太清楚为什么会话会这样。
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()
}
您可能需要在尝试切换相机之前更新
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
将恢复到之前的状态。