Экземпляр AVCaptureOutput не может быть добавлен к более чем одной ошибке сеанса Swift - PullRequest
1 голос
/ 19 января 2020

Я пытаюсь записать видео в моем приложении iPhone, используя AVCaptureSession. Он работает нормально в первый раз, однако, если я нажимаю кнопку «Запись» во второй раз, приложение завершает работу с ошибкой ниже:

Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '** * - [AVCaptureSession addOutput:] Экземпляр AVCaptureOutput не может быть добавлен к более чем одному сеансу '

Первое, что я получаю, не может поддерживать ошибку нескольких сеансов video / audio, и я добавил код, чтобы проверить, если вход добавляется перед добавлением другого входа. Теперь я получаю эту новую ошибку.

Любая помощь приветствуется.

class CaptureViewViewController: BaseViewController,AVCaptureFileOutputRecordingDelegate{

let session: AVCaptureSession = AVCaptureSession()
var movieOutput = AVCaptureMovieFileOutput()

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

    session.beginConfiguration()
    session.sessionPreset = AVCaptureSession.Preset.high

    if let device = AVCaptureDevice.default(.builtInWideAngleCamera, for: AVMediaType.video, position: .front)
        {
            if let audioDevice = AVCaptureDevice.default(for: AVMediaType.audio){

                do {
                    let audioInput = try AVCaptureDeviceInput(device: audioDevice)
                    if let inputs = session.inputs as? [AVCaptureDeviceInput] {
                        for input in inputs {
                            session.removeInput(input)
                        }
                    }
                    self.session.addInput(audioInput)
                } catch {
                    print("Unable to add audio device to the recording.")
                }
             }
             do {
                if let inputs = session.inputs as? [AVCaptureDeviceInput] {
                    for input in inputs {
                        session.removeInput(input)
                    }
                }
                try session.addInput(AVCaptureDeviceInput(device: device))

            } catch {
                print(error.localizedDescription)
            }

            let previewLayer = AVCaptureVideoPreviewLayer(session: session)
            self.preViewImage.layer.addSublayer(previewLayer)
            previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
            previewLayer.frame = self.preViewImage.layer.bounds
        }
            movieOutput.movieFragmentInterval = CMTime.invalid
            session.addOutput(movieOutput
            session.commitConfiguration()
            session.startRunning()

}

@IBAction func handleMoviewRecord(_ sender: Any) {

        if videoRecordState == .stop {

//            let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! as NSURL
//            if let fileUrl = documentsUrl.appendingPathComponent( "output.mov" )?.absoluteURL {
//                print(fileUrl)
            let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
            let fileUrl = paths[0].appendingPathComponent("output.mov")
            try? FileManager.default.removeItem(at: fileUrl)
            movieOutput.startRecording(to: fileUrl, recordingDelegate: self)

           // (to: URL(fileURLWithPath: paths), recordingDelegate: self)
           recordVideoButton.setTitle("Stop Recording", for: .normal)
           recordVideoButton.backgroundColor = UIColor.red
           videoRecordState = .start
          // }
        }else {
           self.movieOutput.stopRecording()
            session.stopRunning()
           recordVideoButton.setTitle("Start Recording", for: .normal)
           videoRecordState = .stop
           session.removeOutput(movieOutput)

        }
    }

     func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {
                print("FINISHED \(Error.self)")

                  if error == nil {
                      UISaveVideoAtPathToSavedPhotosAlbum(outputFileURL.path, nil, nil, nil)
                        UserDefaults.set(.videoPath, to: outputFileURL.path)
                    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "refresh"), object: nil)
                    navigationController?.popViewController(animated: true)

           }
        }
...