요즘 드라이빙에 빠져서 드라이빙 영상들을 찍어보고 있습니다.
근데 영상만이 아니라, 경로까지 함께 저장해서 지도에 표시하는 등 드라이빙 관련 앱을 만들어보고자
1차적으로 동영상을 자체적으로 녹화할 수 있는 앱 기술을 확인하고자 합니다.
import AVFoundation
캡처 동작을 구성하고 입력 장치에서 캡처 출력으로의 데이터 흐름을 조정하는 객체
input devices -> session -> output media
captureSession.beginConfiguration()
let videoDevice = AVCaptureDevice.default(.builtInWideAngleCamera,
for: .video, position: .unspecified)
guard
let videoDeviceInput = try? AVCaptureDeviceInput(device: videoDevice!),
captureSession.canAddInput(videoDeviceInput)
else { return }
captureSession.addInput(videoDeviceInput)
Device 추가 관련해서 아래 내용 확인이 필요
let photoOutput = AVCapturePhotoOutput()
guard captureSession.canAddOutput(photoOutput) else { return }
captureSession.sessionPreset = .photo
captureSession.addOutput(photoOutput)
captureSession.commitConfiguration()
여기까지가 비디오 녹화 및 저장을 위한 session 생성 및 session에 input, output 객체 연결하는 부분이였고
카메라 화면을 표시하기 위한 preview 내용입니다.
카메라 장치의 비디오를 표시하는 핵심 애니메이션 레이어
session 에 previewLayer를 연결하여 카메라 화면을 표기할 수 있습니다.
self.previewView.videoPreviewLayer.session = self.captureSession // 애플 예시코드
// 또는
let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) // GPT 샘플 코드
previewLauer의 connection 을 사용해서 videoOrientation 을 설정하라고 합니다.
연결이 이를 통해 흐르는 비디오에 적용하는 회전 각도입니다.
비디오 화면 회전은.. 직접 해보면서 알아봐야할 듯 합니다.
input, output 구성이 완료된 이후에 startRunning()을 호출해 캡쳐를 시작합니다.
동영상인 AVCaptureVideoDataOutput 의 경우 즉시 캡쳐가 실행되지만
사진인 AVCapturePhotoOutput 의 경우 session 실행 후 capturePhoto(with:delegate:)를 호출해야 한다고 합니다.
샘플 프로젝트도 있는 것 같아 이 부분은 다음글에서 정리해보겠습니다.
AVCam: Building a camera app