原因:
iPhone 13 Pro 系列及以后的 Pro 机型,其超广角镜头具有较小的焦距和较大的光圈,能够实现近距离对焦拍摄。当用户靠近被摄物体到一定程度时,系统会自动切换到超广角镜头进行拍摄。而开发中并未适配这种情况,导致无法对焦,画面模糊。
AVCaptureDeviceType 摄像头类型详解
- AVCaptureDeviceTypeBuiltInTripleCamera
- 支持设备
iPhone 12 Pro 及更新 Pro 机型(如 iPhone 13 Pro、14 Pro 系列等)。 - 硬件配置
- 三摄系统:超广角(Ultra Wide)、广角(Wide)、长焦(Telephoto)。
- 核心特性
- 支持 光学变焦(如 3x、5x 或更高倍率)。
- 深度融合(Deep Fusion)、夜间模式(Night Mode)。
- 微距拍摄(iPhone 13 Pro 起):自动切换超广角镜头实现近距离对焦。 - 应用场景
多镜头协作场景(变焦、低光优化、微距摄影等)。
- AVCaptureDeviceTypeBuiltInDualWideCamera
- 设备支持:iPhone 11系列、iPhone 12/13 mini等。
- 硬件配置:双广角镜头系统,包含超广角(Ultra Wide)和广角(Wide)镜头。
- 特性:
- 支持更宽广的视角切换(如从1x到0.5x)。
- 深度融合、夜间模式。
- 应用场景:需要超广角与广角切换的场景,如风景摄影或狭窄空间拍摄。
- AVCaptureDeviceTypeBuiltInWideAngleCamera
- 设备支持:所有支持摄像头的iOS设备(单摄机型,如旧款iPhone或iPad)。
- 硬件配置:单个广角镜头。
- 特性:
- 基础拍摄功能,无多摄协作。
- 支持HDR、自动对焦等基本特性。 - 应用场景:无需多摄功能的普通拍摄,作为备选设备回退。
- AVCaptureDeviceTypeBuiltInDualCamera
- 设备支持:iPhone 7 Plus至iPhone Xs Max等双摄机型。
- 硬件配置:广角(Wide) + 长焦(Telephoto)双镜头。
- 特性:
- 支持2x光学变焦、人像模式(Portrait Mode)。
- 光学防抖(OIS)。 - 应用场景:人像摄影、光学变焦需求。
解决方案:
/// 从当前手机寻找符合需要的采集设备。
+ (AVCaptureDevice *)cameraWithPosition:(AVCaptureDevicePosition)position {
NSArray<AVCaptureDeviceType> *deviceTypes = @[AVCaptureDeviceTypeBuiltInWideAngleCamera];
if (@available(iOS 10.2, *)) {
deviceTypes = @[AVCaptureDeviceTypeBuiltInWideAngleCamera, AVCaptureDeviceTypeBuiltInDualCamera];
}
if (@available(iOS 13.0, *)) {
deviceTypes = @[AVCaptureDeviceTypeBuiltInTripleCamera,AVCaptureDeviceTypeBuiltInDualWideCamera,AVCaptureDeviceTypeBuiltInWideAngleCamera, AVCaptureDeviceTypeBuiltInDualCamera];
}
AVCaptureDeviceDiscoverySession *deviceDiscoverySession = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:deviceTypes mediaType:AVMediaTypeVideo position:position];
NSArray *devices = deviceDiscoverySession.devices;
for (AVCaptureDevice *device in devices) {
if ([device position] == position) {
return device;
}
}
return nil;
}
extension AVCaptureDevice {
public class func captureDevice(forPosition position: AVCaptureDevice.Position) -> AVCaptureDevice? {
var deviceTypes: [AVCaptureDevice.DeviceType] = [.builtInWideAngleCamera] // 设备类型:广角镜头、双镜头
if #available(iOS 10.2, *) {
deviceTypes = [.builtInWideAngleCamera, .builtInDualCamera]
}
if #available(iOS 13.0, *) {
// 搜索设备的顺序
deviceTypes = [.builtInTripleCamera, .builtInDualWideCamera, .builtInWideAngleCamera, .builtInDualCamera]
}
let discoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: deviceTypes, mediaType: .video, position: position)
return discoverySession.devices.first { $0.position == position }
}
}