Implementing camera switch (front to back, vice versa)

I'm having trouble understand how to switch camera from front to back, back to front upon the touch of a button.


My current code doesn't work.


I get " Multiple audio/video AVCaptureInputs are not currently supported'


Here is what I have so far:

import UIKit
import AVFoundation
import Photos


class CameraViewController :UIViewController {
    
    func applyRoundCorner(_ object: AnyObject){
        object.layer.cornerRadius = (object.frame.size.width)/2
        object.layer.masksToBounds = true
    }
    
    
    @IBOutlet weak var cameraButton: UIButton!
    @IBOutlet weak var imagePreview: UIImageView!
    
    @IBAction func Library(_ sender: Any) {
    }
    


    @IBAction func FlipCamera(_ sender: Any) {
        captureSession.stopRunning()
        cameraPreviewlayer?.removeFromSuperlayer()
        //cameraPreviewlayer = nil
        //self.captureSession = nil
        
        setupCaptureSession()
        if currentCamera! == backCamera{
            //print(currentCamera)
            currentCamera = frontCamera}
        else {
            currentCamera = backCamera}
        setupCaptureSession()
        setupInputOutput()
        setupPreviewLayer()
        startRunningCaptureSession()
        
    }
    
    
   var captureSession = AVCaptureSession()
   var backCamera: AVCaptureDevice?
   var frontCamera: AVCaptureDevice?
   var currentCamera: AVCaptureDevice?
   var cameraPreviewlayer: AVCaptureVideoPreviewLayer?
   var photoOutput: AVCapturePhotoOutput?
   var image: UIImage?
    
    
   override func viewDidLoad() {
    super.viewDidLoad()
    
    self.applyRoundCorner(cameraButton)
    setupCaptureSession()
    setupInputOutput()
    setupPreviewLayer()
    startRunningCaptureSession()
   
    
    }


  
    
   func setupCaptureSession(){
       captureSession.sessionPreset = AVCaptureSession.Preset.photo // Why exclamation point?
       let availableDevice = AVCaptureDevice.DiscoverySession(deviceTypes: [AVCaptureDevice.DeviceType.builtInWideAngleCamera], mediaType: .video, position: .unspecified)
       let devices = availableDevice.devices //back or front
        
        
       for device in devices {
            
           if device.position == AVCaptureDevice.Position.back{
                backCamera = device
           }else if device.position == AVCaptureDevice.Position.front{
                frontCamera = device
            }
            }
    currentCamera = backCamera
        }
    
    
   func setupInputOutput(){
       do {
           let captureDeviceInput = try AVCaptureDeviceInput(device: currentCamera!)
           captureSession.addInput(captureDeviceInput)
           photoOutput = AVCapturePhotoOutput()
           photoOutput?.setPreparedPhotoSettingsArray([AVCapturePhotoSettings(format:[AVVideoCodecKey:AVVideoCodecType.jpeg])], completionHandler: nil)
           captureSession.addOutput(photoOutput!)
           }
       catch{
           print(error)
            
        }
    }
    
    func setupPreviewLayer(){
        cameraPreviewlayer = AVCaptureVideoPreviewLayer(session: captureSession)
        cameraPreviewlayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
        cameraPreviewlayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
        cameraPreviewlayer?.frame = self.imagePreview.frame
        self.view.layer.insertSublayer(cameraPreviewlayer!, at: 0)
    }
        
    func startRunningCaptureSession(){
            captureSession.startRunning()
        }




    @IBAction func TakePhoto(_ sender: Any) {
        let settings = AVCapturePhotoSettings()
        photoOutput?.capturePhoto(with: settings, delegate: self)
                }




    override func prepare(for segue: UIStoryboardSegue, sender: Any?){
        if segue.identifier == "showPhotoSegue"{
            let previewVC = segue.destination as! PreviewViewController
            previewVC.image = self.image
    }
}


}
    extension CameraViewController: AVCapturePhotoCaptureDelegate{
        func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
            if let imageData = photo.fileDataRepresentation(){
                image = UIImage(data: imageData)
                performSegue(withIdentifier:"showPhotoSegue", sender: nil)        }
    }




    


}

Replies

Where do you get the message ? Line 93 ?


When: first time you flip ?

Hi, first time I flip I get the crashing error.

I'm not really sure where I get the error as only this part is higlighted:



`class AppDelegate: UIResponder, UIApplicationDelegate {`




As for the traceback, I see this:



2018-07-26 19:51:43.630667-0400 Fish[636:305182] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[AVCaptureSession addInput:] Multiple audio/video AVCaptureInputs are not currently supported'

*** First throw call stack:

(0x181f3a364 0x181180528 0x1878a6e50 0x104065408 0x1040637e8 0x1040638f0 0x18b4506b4 0x18b450634 0x18b43b1dc 0x18b44ff28 0x18b44fa480x18b44af60 0x18b41bf64 0x18bd7131c 0x18bd738a8 0x18bd6c7c0 0x181ee297c 0x181ee28fc 0x181ee2184 0x181edfd5c 0x181dffe58 0x183cacf84 0x18b47f67c0x10406ab10 0x18191c56c)

libc++abi.dylib: terminating with uncaught exception of type NSException

Hi, Why is my post being moderated? What does that mean?

So, which line was the error ?

Have you resolved the problem?

It seems I have met the same problem.


I think the crash is happened in Line 87:captureSession.addInput(captureDeviceInput)

Did you find out how to resolve it?