Я пытаюсь записать видео в моем приложении 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)
}
}