본문 바로가기
Apple의 SDK/AVFoundation

[AVFoundation/capture] 캡쳐 기기 고르기 (AVCaptureDevice)

by lody.park 2024. 12. 8.

🔗 관련 공식 문서 아티클

 

한글 제목으로 캡쳐 기기라고 했는데, 기기, 장치, 디바이스 ~ 한글식으로는 표현할 방법이 많아서 그냥 영어 발음 디바이스라고 퉁쳤다.

디바이스들은 사진과 비디오 캡쳐를 위한 많은 옵션을 제공함.

- front(전면) 또는 back(후면) 카메라

- TrueDepth 카메라 또는 dual 카메라와 같은 고급 기능

 

자동으로 적절한 카메라 디바이스를 선택하거나 사용자가 카메라를 고를 수 있도록 UI를 제공하도록 하는 것은 카메라 기능을 가진 앱을 개발하는데에 있어서 중요한 부분임.

 

AVFoundation 은 카메라 디바이스를 고를 수 있는 두 가지 방법을 제공하고 있음.

- AVCaptureDevice.default( :for:position:) 메서드

- AVCaptureDevice.DiscoverySession 클래스

 

1. 빠르게 기본 디바이스를 선택하기

어떤 종류의 캡쳐 디바이스를 찾는지 정확하게 알고 있다면, default( :for:position:) 메서드로 사용하여 디바이스를 선택.

 

예시)

if let device = AVCaptureDevice.default(.builtInDualCamera,
                                        for: .video, position: .back) {
    return device
} else if let device = AVCaptureDevice.default(.builtInWideAngleCamera,
                                               for: .video, position: .back) {
    return device
} else {
    fatalError("Missing expected back camera device.")
}


2. Discovery Session 으로 디바이스 정렬과 필터링하기

특정 기준에 맞는 모든 디바이스를 확인하고, 필요한 기기를 선택하려면 DiscoverySession 클래스를 사용.

 

1. 필요한 디바이스 타입에 대한 탐색 세션(DiscoverySession)을 생성.

2. 세션의 devices 리스트를 읽어 조건에 맞는 기기들을 가져온다.

3. *리스트 순서를 활용하여 조건에 맞는 최적의 기기를 선택한다.

 

* devices 리스트는 세션에서 설정한 타입에 맞춰 자동 정렬하기 때문에, 이를 활용해야한다.

 

예시)

func bestDevice(in position: AVCaptureDevice.Position) -> AVCaptureDevice {

    // ✅ 세션을 생성
    let discoverySession = AVCaptureDevice.DiscoverySession(
        deviceTypes: [.builtInTrueDepthCamera, .builtInDualCamera, .builtInWideAngleCamera],
        mediaType: .video, // ⭐️ audio(오디오), depthData(깊이 데이터), video(비디오), 등등.. AVMediaType
        position: .unspecified // ⭐️ unspecified(지정 안함), front(전면), back(후면)
    )
    
    // ✅ 탐색된 디바이스 목록 불러오기
    let devices = discoverySession.devices
    guard !devices.isEmpty else { fatalError("Missing capture devices.") }

    return devices.first(where: { device in device.position == position })!
}

 

 

'Apple의 SDK > AVFoundation' 카테고리의 다른 글

[AVFoundation/capture] 캡쳐 설정하기  (0) 2024.12.07