티스토리 뷰
사진 또는 비디오를 캡처하기 전에 입력 장치, 출력 미디어, 미리 보기 뷰 및 기본 설정을 구성
AVCaptureSession은 iOS 및 macOS에서 모든 미디어 캡처를 위한 기초입니다.
OS 캡처 인프라 및 캡처 장치에 대한 앱의 독점 액세스와 입력 장치에서 미디어 출력으로의 데이터 흐름을 관리합니다.
입력과 출력 간의 연결을 구성하는 방법에 따라 캡처 세션의 기능이 정의됩니다.
예를 들어, 아래 다이어그램은 아이폰 후면 카메라와 마이크를 사용하여 사진과 영화를 모두 캡처할 수 있는 캡처 세션을 보여줍니다.
Figure 1 Architecture of an example capture session
Connect Inputs and Outputs to the Session
모든 캡처 세션에는 적어도 하나의 캡처 입력 및 캡처 출력이 필요합니다.
입력 캡처(AVCaptureInput subclass)는 일반적으로 iOS 장치 또는 Mac에 내장된 카메라와 마이크와 같은 장치를 기록하는 미디어 소스입니다.
캡처 출력(AVCaptureOutput subclass)은 이미지 및 동영상 파일과 같은 미디어를 생성하기 위해 캡처 입력에 의해 제공되는 데이터를 사용합니다.
카메라로 비디오 입력(사진이나 동영상을 캡처하려면 적절한 AVCaptureDevice를 선택하고 해당 AVCaptureDeviceInput을 만든 다음 세션에 추가합니다.
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)
iOS는 카메라 장치를 선택할 수 있는 여러 가지 다른 방법을 제공합니다. 자세한 내용은 Choosing a Capture Device를 참조하십시오.
다음으로 선택한 카메라에서 캡처할 미디어 종류에 대한 출력을 추가합니다. 예를 들어, 사진 캡처를 활성화하려면 AVCapturePhotoOutput을 세션에 추가합니다.
let photoOutput = AVCapturePhotoOutput()
guard captureSession.canAddOutput(photoOutput) else { return }
captureSession.sessionPreset = .photo
captureSession.addOutput(photoOutput)
captureSession.commitConfiguration()
세션은 여러 개의 입력과 출력을 가질 수 있습니다. 예를 들어:
* 동영상에 비디오와 오디오를 모두 녹화하려면 카메라와 마이크 장치 모두에 대한 입력을 추가합니다.
* 동일한 카메라에서 사진과 동영상을 모두 캡처하려면 AVCapturePhotoOutput 및 AVCaptureMovieFileOutput을 세션에 추가합니다.
중요
세션의 입력 또는 출력을 변경하기 전에 beginConfiguration()을 호출하고 변경한 후에는 commitConfiguration()을 호출합니다.
Display a Camera Preview
전통적인 카메라의 뷰파인더에서처럼 사진을 찍거나 비디오 녹화를 시작하기 전에 사용자가 카메라의 입력을 볼 수 있도록 하는 것이 중요합니다.
AVCaptureVideoPreviewLayer를 캡처 세션에 연결하여 이러한 미리 보기를 제공할 수 있습니다.
캡처 세션은 세션이 실행될 때마다 카메라에서 실시간 비디오 피드를 표시합니다.
AVCaptureVideoPreviewLayer는 핵심 애니메이션 레이어이므로 다른 CALayer 하위 클래스와 마찬가지로 인터페이스에 표시하고 스타일을 지정할 수 있습니다.
미리보기 레이어를 UIKit 앱에 추가하는 가장 간단한 방법은 아래와 같이 레이어 클래스가 AVCaptureVideoPreviewLayer인 UIView 하위 클래스를 정의하는 것입니다.
class PreviewView: UIView {
override class var layerClass: AnyClass {
return AVCaptureVideoPreviewLayer.self
}
/// Convenience wrapper to get layer as its statically known type.
var videoPreviewLayer: AVCaptureVideoPreviewLayer {
return layer as! AVCaptureVideoPreviewLayer
}
}
그런 다음 미리 보기 계층을 캡처 세션과 함께 사용하려면 계층의 세션 속성을 설정합니다.
self.previewView.videoPreviewLayer.session = self.captureSession
Run the Capture Session
입력, 출력 및 미리 보기를 구성한 후에는 startRunning()을 호출하여 데이터가 입력에서 출력으로 흐르도록 합니다.
일부 캡처 출력의 경우 세션을 실행하면 미디어 캡처를 시작할 수 있습니다.
예를 들어 세션에 AVCaptureVideoDataOutput이 포함된 경우 세션이 실행되자마자 비디오 프레임을 받기 시작합니다.
다른 캡처 출력에서는 먼저 세션 실행을 시작한 다음 캡처 출력 클래스 자체를 사용하여 캡처를 시작합니다.
예를 들어 사진 앱에서 세션을 실행하면 뷰파인더 형식의 미리 보기가 가능하지만 사진을 찍으려면 AVCapturePhotoOutputPhoto(:delegate:) 메서드를 사용합니다.
'iOS' 카테고리의 다른 글
[iOS] Choosing a Capture Device 번역 (0) | 2021.10.22 |
---|---|
[iOS] AVCaptureSession 번역 (0) | 2021.10.22 |
[iOS] Dependency Injection(DI) 의존성 주입 (0) | 2021.09.23 |
[iOS] Tuist 사용법 - Project Settings (3) (0) | 2021.09.17 |
[iOS] Tuist 사용법 - Dependencies (2) (0) | 2021.09.17 |