用途:为 iPhone Duo 的两个前置摄像头(外屏超广角、内屏屏下超广角)构建相机采集逻辑。该设备上“前置”不再等于“朝向用户”,需要先选择策略。
主要能力与取舍:
- 虚拟前置摄像头:按常规方式用 AVCaptureDevice.DiscoverySession 请求 .front 与 Wide/Ultra Wide,会解析到新的虚拟前置摄像头,自动在内屏(展开)与外屏(闭合)之间切换,无需写切换代码;但只暴露两颗物理摄像头的公共能力,最高 1080p 60 fps,不支持深度。
- 独立摄像头:分别使用内置外屏超广角与内置内屏超广角设备类型。内屏(屏下)最高 1080p @ 60 fps,外屏最高 4K @ 120 fps,两者均支持深度。能力完整,但需自行在开合时切换摄像头。
朝向判断:AVCaptureDevice 的 position 只表示硬件位置,两颗前置都报告 .front,无法说明相对当前 UI 的朝向。使用 AVKit 中的 AVCaptureDeviceDirectionCoordinator,由 UIView、要监控的设备类型和变更处理器构建,随设备移动更新。它锚定到某个视图,因此朝向是相对该视图所在显示屏的;同时驱动两块屏时,每个视图各建一个协调器。
并发与数据传递:协调器绑定视图,隔离在主 actor,变更处理器不得直接调用 AVFoundation API。处理器收到 AVCaptureDeviceDirectionMap,含 forwardFacingDeviceDescriptors 与 backwardFacingDeviceDescriptors 两个数组,也可随时从 deviceDirections 读取。AVCaptureDeviceDescriptor 是可发送的替身,携带 uniqueID、localizedName、deviceType、mediaTypes、position,应把它传给相机 actor 再构造 AVCaptureDevice。这两个类型位于 AVKit 而非 AVFoundation。处理器需自行选择(通常取第一个 deviceType 匹配的朝前描述符),不要假设只有一颗朝前。
处理器职责:重配置 AVCaptureSession 以继续从当前朝前的摄像头采集;重新评估镜像(镜像应跟随朝向而非位置,后置变为朝前时预览应像自拍);更新相关 UI。
预览与旋转:用 AVCaptureVideoPreviewLayer 的 videoGravity 控制预览留白或铺满;前置超广角可用 AVCaptureDevice 的 dynamicAspectRatio 选横向比例填满内屏。采用 AVCaptureDeviceRotationCoordinator 保持预览与拍摄方向正确,它在应用跨屏移动时更新;采用后应关闭摄像头传感器方向补偿(iPhone Duo 前置默认开启,会重复工作)。方向与旋转是两个独立协调器,多数相机应用两者都需要。
检查清单:基于 iOS 27.1 SDK 构建;先决定虚拟或独立方案;独立方案每个视图一个方向协调器;处理器中读取方向映射、选朝前描述符、重配会话、重定镜像、更新 UI,并以描述符跨 actor 传递设备;设置 videoGravity 与前置 dynamicAspectRatio;采用旋转协调器后关闭传感器方向补偿;可考虑 CameraCaptureAccessory 让被摄者在外屏看到画面;在 Device Hub 中测试会话中途开合与翻转。
限制:资料未提供具体收费、价格、平台支持范围或效果数据;实现细节以 Apple 相关文档与 SDK 为准。