AVFoundation内置相机类型差异及摄像头选型适配咨询
AVCaptureDevice 后置摄像头类型差异与适配方案
基础类型定义与对应机型
首先纠正你之前整理的信息错误:
builtInWideAngleCamera不是双摄设备,是单颗广角定焦摄像头,是所有iPhone都具备的基础后置摄像头硬件。你之前记录的双摄定义属于类型混淆。
各类型准确说明与对应机型如下:
builtInDualCamera:广角+长焦的双摄组合设备,对应iPhone 7 Plus、iPhone 8 Plus、iPhone X,你猜测它对应iPhone X的相机配置是正确的。builtInDualWideCamera:超广角+广角的双摄组合设备,对应iPhone 11、iPhone 12 mini、iPhone 13 mini、iPhone SE(第三代)等非Pro线双摄机型,你猜测它对应iPhone 11的相机配置是正确的。builtInTripleCamera:超广角+广角+长焦的三摄组合设备,对应iPhone 11 Pro及之后所有Pro系列三摄机型。builtInUltraWideCamera:单颗超广角定焦摄像头,仅在搭载超广角硬件的iPhone 11及之后机型上暴露,属于单独硬件入口,一般不需要在默认选优场景调用。builtInWideAngleCamera:单颗广角定焦摄像头,对应所有单摄iPhone(iPhone 6s及更早单摄机型、iPhone SE 1/2代),所有多摄iPhone也会同步暴露该单硬件入口。
适配问题解答
针对你提出的两个适配疑问,明确答复如下:
- 仅配置
.builtInTripleCamera、.builtInDualCamera、.builtInWideAngleCamera三类无法覆盖所有iPhone后置摄像头:搭载超广角+广角双摄的机型(比如iPhone 11、12/13 mini)不会暴露builtInDualCamera类型(该类型仅适配老款广角+长焦双摄),如果不把builtInDualWideCamera加入列表,这些机型上只会 fallback 到单颗广角摄像头,无法使用双摄的硬件级无缝变焦、多摄协同能力。 - 是的,
AVCaptureDevice.DiscoverySession只会返回你传入deviceTypes数组中包含的设备类型,如果你需要调用builtInWideAngleCamera,必须将其加入列表,否则不会返回对应设备。
修正后的最优设备选择代码
按照「三摄 > 超广角+广角双摄 > 广角+长焦双摄 > 单颗广角」的硬件优先级选择后置摄像头的实现如下,DiscoverySession返回的设备顺序和你传入的deviceTypes顺序一致,数组第一个元素就是当前设备能支持的最优摄像头:
import AVFoundation class CameraManager { static let shared = CameraManager() let discoverySession = AVCaptureDevice.DiscoverySession( deviceTypes: [ .builtInTripleCamera, .builtInDualWideCamera, .builtInDualCamera, .builtInWideAngleCamera ], mediaType: .video, position: .back ) func getBestDevice() -> AVCaptureDevice? { let devices = discoverySession.devices guard !devices.isEmpty else { fatalError("Missing capture devices.")} return devices.first } }
调用方式保持原有逻辑即可:
CameraManager.shared.getBestDevice()
补充提示:如果你需要单独调用超广角、长焦的独立硬件做特殊功能,再把
.builtInUltraWideCamera、.builtInTelephotoCamera加入deviceTypes列表即可,普通视频拍摄场景用组合设备就能覆盖全焦段无缝切换的需求。
内容的提问来源于stack exchange,提问作者Yuuu
相关产品推荐
相关产品推荐

