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()
}