ios - 前置摄像头无法添加输入,从后到前切换摄像头?

标签 ios swift xcode avcapturedevice avcapture

我在自定义 View (cameraView)中打开相机,后置摄像头工作正常,但当我使用自定义转动将其切换到前置摄像头时出现问题 button(TurnCamera) ,我得到以下信息:

input "AVCaptureFigVideoDevice: 0x1035c9e80 [Front Camera][com.apple.avfoundation.avcapturedevice.built-in_video:1]"

但我的自定义相机 View 仍然显示后置摄像头,并获取 captureSession.canAddInput(input) = false ,我是否应该为前置摄像头授予对 info.plist 的任何访问权限。

我的打开相机的代码是:-

func camera(){
        let devices = AVCaptureDevice.devices(for: AVMediaType.video)

        currentCaptureDevice = (usingFrontCamera ? getFrontCamera() : getBackCamera())

        print(currentCaptureDevice)

        for device in devices{

            do{
                let input = try AVCaptureDeviceInput(device: currentCaptureDevice!)
                    if captureSession.canAddInput(input){

                        captureSession.addInput(input)
                        sessionOutput.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]

                        if captureSession.canAddOutput(sessionOutput){

                            captureSession.startRunning()
                            captureSession.addOutput(sessionOutput)
                            previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
                            previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
                            previewLayer.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
                            cameraView.layer.addSublayer(previewLayer)
                            previewLayer.position = CGPoint(x: self.cameraView.frame.width/2, y: self.cameraView.frame.height/2)
                            cameraView.contentMode = .scaleToFill
                            previewLayer.bounds = cameraView.frame
                        }
                    }
                }
                catch{

                    print("error")
            }
        }
    }

获取后置摄像头的功能是:-

func getBackCamera() -> AVCaptureDevice{
        return AVCaptureDevice.default(for: AVMediaType.video)!
    }

获取前置摄像头的函数是:-

func getFrontCamera() -> AVCaptureDevice?{
        let videoDevices = AVCaptureDevice.devices(for: AVMediaType.video)

        for device in videoDevices{
            let device = device as! AVCaptureDevice
            if device.position == AVCaptureDevice.Position.front {
                return device
            }
        }
        return nil
    }

切换相机的按钮操作:-

@IBAction func TurnCamera(_ sender: UIButton) {

        usingFrontCamera = !usingFrontCamera
        camera()

    }

在以下位置查找演示项目:- https://www.dropbox.com/s/6cfmbh3tnw5y4f7/SwitchingCamera.zip?dl=0

提前致谢

最佳答案

我得到了答案,当从后到前切换时,我没有删除捕获 session 输入。

我只对两个函数进行了更改 1:- 早些时候

func getBackCamera() -> AVCaptureDevice{
        return AVCaptureDevice.default(for: AVMediaType.video)!
    }

现在,

func getBackCamera() -> AVCaptureDevice{

        for i in captureSession.inputs {
            captureSession.removeInput(i as! AVCaptureInput)
        }

        return AVCaptureDevice.default(for: AVMediaType.video)!
    }

2:- 早些时候,

func getFrontCamera() -> AVCaptureDevice?{
        let videoDevices = AVCaptureDevice.devices(for: AVMediaType.video)

        for device in videoDevices{
            let device = device as! AVCaptureDevice
            if device.position == AVCaptureDevice.Position.front {
                return device
            }
        }
        return nil
    }

现在,

func getFrontCamera() -> AVCaptureDevice?{

        for i in captureSession.inputs {
            captureSession.removeInput(i as! AVCaptureInput)
        }

        let videoDevices = AVCaptureDevice.devices(for: AVMediaType.video)

        for device in videoDevices{
            let device = device
            if device.position == AVCaptureDevice.Position.front {

                return device

            }
        }
        return nil
    }

获取演示:- https://www.dropbox.com/s/p6opina5gtg8nvd/Updated%20Switching%20Camera%202.zip?dl=0

关于ios - 前置摄像头无法添加输入,从后到前切换摄像头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54801539/

相关文章:

ios - 添加 viewController 作为 subview Swift 不显示任何组件

ios - 导航栏中的 Facebook 分享按钮显示为非事件状态

objective-c - XCode/Cocoa Mac 更改 View

ios - ViewController 的presentingViewController 设置错误?

ios - UIsearchbar 不将数据返回到表

ios - 如何停止使用渐变 UICollectionCell 创建新图层?重写函数prepareForReuse()

ios - 如何知道 iDevice 的当前方向

ios - Peek-and-Pop UIView 显示 SFSafariViewController

ios - preferredInterfaceOrientationForPresentation 不工作

ios - 自发的 Swift 编译器错误