0
votes

I am having some difficulty with AVCaptureSession when popping view controllers. I have a view controller in a navigation controller where a user takes a photo. After the photo is captured, I segue to a "preview photo" view controller. If the user doesn't like the photo, they can go back and re take it. When I pop the preview photo view controller, the app crashes with error "Multiple audio/video AVCaptureInputs are not currently supported'"

I thought that maybe I can remove/ refresh the input session but it's still crashing.

Any support/ advice is greatly appreciated!

segue:

 @IBAction func cancelPressed(_ sender: UIButton) {
    _ = self.navigationController?.popViewController(animated: true)
}

camera config (which works fine):

func setupCaptureSessionCamera() {
    //this makes sure to get full res of camera
    captureSession.sessionPreset = AVCaptureSession.Preset.photo

    var devices = AVCaptureDevice.devices(for: .video)

    //query available devices
    for device in devices {

        if device.position == .front {
            frontFacingCamera = device
        } else if device.position == .back {
            backFacingCamera = device
        }
    }//end iteration

    //set a default device
    currentDevice = backFacingCamera

    //configure session w output for capturing still img
    stillImageOutput = AVCaptureStillImageOutput()
    stillImageOutput?.outputSettings = [AVVideoCodecKey : AVVideoCodecType.jpeg]


    do {

        let captureDeviceInput = try AVCaptureDeviceInput(device: currentDevice!)

        captureSession.addInput(captureDeviceInput)
        captureSession.addOutput(stillImageOutput!)

        //setup camera preview layer
        cameraPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)

        //add the preview to our specified view in the UI
        view.layer.addSublayer(cameraPreviewLayer!)
        cameraPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
        cameraPreviewLayer?.frame = cameraView.frame

        captureSession.startRunning()

    } catch let error {

        print(error)

    }//end do 
}

What I tried (remove inputs in view will appear if the sender is preview photo controller):

func refreshCamera() {

    captureSession.beginConfiguration()

    for input in captureSession.inputs {

        captureSession.removeInput(input as! AVCaptureDeviceInput)

    }
        captureSession.commitConfiguration()

}
1
You're not showing enough of your code. - matt
@matt What else might you need? - user3344239

1 Answers

0
votes

It was much simpler than I was imagining. All that is needed is to first check if there is already input or not before calling the setupCameraSession method:

if captureSession.inputs.isEmpty {

setupCaptureSessionCamera()

}