iPad 11英寸第三代前置摄像头调用capturePhoto()无法拍摄最高分辨率照片
问题原因排查方案
1. 确认深度数据交付的分辨率限制
- 苹果官方硬件适配规则说明,部分iPad/iPhone设备的摄像头模块,在同时启用深度数据/肖像效果遮罩交付时,会主动下调照片输出的最大分辨率,这是硬件ISP算力限制导致的设备特异性表现,M1款11英寸第三代iPad的前置TrueDepth摄像头刚好属于这类受限设备
- 可优先让测试用户先临时关闭深度和肖像遮罩交付再测试:把代码里
photoSettings.isDepthDataDeliveryEnabled = true、photoSettings.isPortraitEffectsMatteDeliveryEnabled = true改为false,确认是否能输出12MP规格照片,如果可以就确认是该限制导致的
2. 检查多输出共存的分辨率适配逻辑
- 你当前同时添加了
AVCaptureVideoDataOutput、AVCaptureMetadataOutput、AVCaptureDepthDataOutput三类输出,多输出共存时系统会自动选取所有输出组件共同支持的最高公共分辨率,而非单摄像头的最高输出规格 - 可临时移除会话中的
AVCaptureVideoDataOutput再测试,若单独保留拍照输出+深度/元数据输出即可达到12MP,说明是视频数据输出的分辨率限制拉低了整体会话的可用分辨率 - 你当前设置的
session.sessionPreset = .photo是通用预设,部分设备开启多输出时该预设不会匹配到最高可用规格,可改为主动查询设备支持的目标格式手动配置:
// 主动匹配最高支持深度交付的格式示例 guard let device = AVCaptureDevice.default(.builtInTrueDepthCamera, for: .video, position: .front) else { return } let targetFormat = device.formats.filter { format in // 筛选同时支持深度交付、且分辨率满足12MP要求的格式 format.isDepthDataDeliverySupported && CMVideoFormatDescriptionGetDimensions(format.formatDescription).width >= 4032 }.max { a, b in CMVideoFormatDescriptionGetDimensions(a.formatDescription).width < CMVideoFormatDescriptionGetDimensions(b.formatDescription).width } if let validFormat = targetFormat { try? device.lockForConfiguration() device.activeFormat = validFormat device.unlockForConfiguration() }
3. 验证photoOutput配置顺序
- 确认你在把
AVCaptureDepthDataOutput添加到会话前,已经提前调用photoOutput.isDepthDataDeliveryEnabled = true开启了拍照输出端的深度支持,配置顺序错误也会导致系统自动降级分辨率 - 如果确认必须同时保留深度数据+多输出能力,可查询该设备前置摄像头开深度时的最大官方支持规格,若官方标注该场景下最高只能输出7MP,则属于硬件固有约束,无上层优化空间
内容的提问来源于stack exchange,提问作者xaphod
相关产品推荐
相关产品推荐

