초기 세팅

						private var session = AVCaptureSession()
private var previewLayer: AVCaptureVideoPreviewLayer!
private let sessionQueue = DispatchQueue(label: "camera.session.queue") // 별도 큐
private var movieOutput = AVCaptureMovieFileOutput()	
					

영상 시작

Camera Input을 통해 movieOutput이 출력되게 만들어주고 AudioInput을 넣어줘 Audio가 비디오 안에 내장될 수 있게 한다.

						/// 영상 관련 처리를 sessionQueue안에서 돌려줘야 한다.
sessionQueue.async {
    self.session.stopRunning()
    self.session.beginConfiguration()
    self.session.sessionPreset = .high
    for input in self.session.inputs {
        self.session.removeInput(input)
    }
    for output in self.session.outputs {
        self.session.removeOutput(output)
    }
    guard let device = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .front),
          let input = try? AVCaptureDeviceInput(device: device)
    else { return }
    if self.session.canAddInput(input) {
        self.session.addInput(input)
    }
    self.movieOutput = AVCaptureMovieFileOutput()
    if self.session.canAddOutput(self.movieOutput) {
        self.session.addOutput(self.movieOutput)
    }
    if let audioDevice = AVCaptureDevice.default(for: .audio),
       let audioInput = try? AVCaptureDeviceInput(device: audioDevice),
       self.session.canAddInput(audioInput) {
            self.session.addInput(audioInput)
    }
    self.session.commitConfiguration()
    self.session.startRunning()
}	
					

오디오 시작

						sessionQueue.async {
    self.session.stopRunning()
    self.session.beginConfiguration()
    for input in self.session.inputs {
        self.session.removeInput(input)
    }
    for output in self.session.outputs {
        self.session.removeOutput(output)
    }
    // 1️⃣ 현재 세션에 등록된 입력들 중 video를 제거
    if let audioDevice = AVCaptureDevice.default(for: .audio),
       let audioInput = try? AVCaptureDeviceInput(device: audioDevice),
       self.session.canAddInput(audioInput) {
        self.session.addInput(audioInput)
    }
    self.movieOutput = AVCaptureMovieFileOutput()
    if self.session.canAddOutput(self.movieOutput) {
        self.session.addOutput(self.movieOutput)
    }
    self.session.commitConfiguration()
    self.session.startRunning()
}