iOS开发 扫描时画面模糊,无法对焦

原因:
iPhone 13 Pro 系列及以后的 Pro 机型,其超广角镜头具有较小的焦距和较大的光圈,能够实现近距离对焦拍摄。当用户靠近被摄物体到一定程度时,系统会自动切换到超广角镜头进行拍摄。而开发中并未适配这种情况,导致无法对焦,画面模糊。

AVCaptureDeviceType 摄像头类型详解

  1. AVCaptureDeviceTypeBuiltInTripleCamera
  • 支持设备
    iPhone 12 Pro 及更新 Pro 机型(如 iPhone 13 Pro、14 Pro 系列等)。
  • 硬件配置
  • 三摄系统:超广角(Ultra Wide)、广角(Wide)、长焦(Telephoto)。
  • 核心特性
    - 支持 光学变焦(如 3x、5x 或更高倍率)。
    - 深度融合(Deep Fusion)、夜间模式(Night Mode)。
    - 微距拍摄(iPhone 13 Pro 起):自动切换超广角镜头实现近距离对焦。
  • 应用场景
    多镜头协作场景(变焦、低光优化、微距摄影等)。
  1. AVCaptureDeviceTypeBuiltInDualWideCamera
  • 设备支持:iPhone 11系列、iPhone 12/13 mini等。
  • 硬件配置:双广角镜头系统,包含超广角(Ultra Wide)和广角(Wide)镜头。
  • 特性:
    - 支持更宽广的视角切换(如从1x到0.5x)。
    - 深度融合、夜间模式。
    - 应用场景:需要超广角与广角切换的场景,如风景摄影或狭窄空间拍摄。
  1. AVCaptureDeviceTypeBuiltInWideAngleCamera
  • 设备支持:所有支持摄像头的iOS设备(单摄机型,如旧款iPhone或iPad)。
  • 硬件配置:单个广角镜头。
  • 特性:
    - 基础拍摄功能,无多摄协作。
    - 支持HDR、自动对焦等基本特性。
  • 应用场景:无需多摄功能的普通拍摄,作为备选设备回退。
  1. 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 }
    }
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容