AVCaptureSession, 드라이빙을 녹화하는 앱을 만들어보자

Minsang Kang·2025년 2월 16일
0

iOS Develop

목록 보기
5/6

도입

요즘 드라이빙에 빠져서 드라이빙 영상들을 찍어보고 있습니다.
근데 영상만이 아니라, 경로까지 함께 저장해서 지도에 표시하는 등 드라이빙 관련 앱을 만들어보고자

1차적으로 동영상을 자체적으로 녹화할 수 있는 앱 기술을 확인하고자 합니다.

Framework

import AVFoundation

AVCaptureSession

캡처 동작을 구성하고 입력 장치에서 캡처 출력으로의 데이터 흐름을 조정하는 객체
input devices -> session -> output media

Setting Up a Capture Session

  • AVCaptureDevice : 카메라나 마이크와 같은 하드웨어 또는 가상 캡처 장치를 나타내는 객체
  • AVCaptureDeviceInput : 캡처 장치에서 캡처 세션으로 미디어 입력을 제공하는 객체
  • AVCaptureConnection : 캡처 입력에서 캡처 출력으로의 연결을 나타내는 객체
  • AVCaptureOutput : 캡처 세션에 대한 미디어 출력 대상을 제공하는 객체의 추상 슈퍼클래스
  • AVCaptureVideoPreviewLayer : 카메라 장치의 비디오를 표시하는 핵심 애니메이션 레이어

beginConfiguration()

  • session의 input 및 output 변경 전에 호출이 필요하다고 합니다.

Input 추가

  • AVCaptureDevice에 따른 AVCaptureDeviceInput을 생성하여 session 에 input으로 설정
  • 여러개의 Input을 추가하는 것도 가능 (예: 비디오, 음성)
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 추가 관련해서 아래 내용 확인이 필요

Output 추가

  • 예시로 사진 저장을 위한 AVCapturePhotoOutput 을 생성하여 session 에 output으로 설정
  • 여러개의 output을 추가하는 것도 가능하다고 합니다 (예: 사진, 비디오)
  • 아래 내용을 토대로 AVCaptureVideoDataOutput 도 있는 것 같습니다.
let photoOutput = AVCapturePhotoOutput()
guard captureSession.canAddOutput(photoOutput) else { return }
captureSession.sessionPreset = .photo
captureSession.addOutput(photoOutput)
captureSession.commitConfiguration()

commitConfiguration()

  • session의 input 및 output 변경 완료 후 호출이 필요하다고 합니다.

여기까지가 비디오 녹화 및 저장을 위한 session 생성 및 session에 input, output 객체 연결하는 부분이였고
카메라 화면을 표시하기 위한 preview 내용입니다.

AVCaptureVideoPreviewLayer

카메라 장치의 비디오를 표시하는 핵심 애니메이션 레이어

Display a Camera Preview

session 에 previewLayer를 연결하여 카메라 화면을 표기할 수 있습니다.

self.previewView.videoPreviewLayer.session = self.captureSession // 애플 예시코드
// 또는
let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) // GPT 샘플 코드

화면 회전

previewLauer의 connection 을 사용해서 videoOrientation 을 설정하라고 합니다.

  • 근데 videoOrientation은 deprecated 로 뜨네요.. -> videoRotationAngle 를 쓰라고 합니다.
  • 내용을 보니 내부적으로 매트릭스를 통해 픽셀 버퍼를 회전시키는 원리인 것 같습니다.
  • 따라서 추가성능이 요구되기 때문에 필요할때만 사용하라고 합니다.
  • AVAssetWriter를 사용하여 회전된 비디오를 동영상 파일에 쓰려면 대신 AVAssetWriterInput에서 transform 속성을 설정하세요.

videoRotationAngle

연결이 이를 통해 흐르는 비디오에 적용하는 회전 각도입니다.


비디오 화면 회전은.. 직접 해보면서 알아봐야할 듯 합니다.

Run the Capture Session

input, output 구성이 완료된 이후에 startRunning()을 호출해 캡쳐를 시작합니다.
동영상인 AVCaptureVideoDataOutput 의 경우 즉시 캡쳐가 실행되지만
사진인 AVCapturePhotoOutput 의 경우 session 실행 후 capturePhoto(with:delegate:)를 호출해야 한다고 합니다.


샘플 프로젝트도 있는 것 같아 이 부분은 다음글에서 정리해보겠습니다.
AVCam: Building a camera app

profile
 iOS Developer

0개의 댓글