画面模糊问题的源头也是来自用户的微距体验不佳,我们对问题深入分析,适当拆解。通过 Apple Development Doc 的查阅及实践,一步步抽丝剥茧,最终完美解决用户的体验痛点,也为我们自身沉淀了展示微距的能力。

在最近两年苹果发布的 iPhone13 Pro Max 和 iPhone14 Pro Max 系列的手机上,如果使用三方主流 app 进行近距离对焦,会产生画面模糊的问题。拍立淘是手机淘宝相机能力的主阵地之一,用户会进行近距离拍照识别商品,或者近距离扫物流单二维码、吊牌条码、药品码等行为,类似手机系统相机的微距能力没有释放出来,会影响用户的使用体验。基于上述背景,为了优化用户体验,拍立淘 iOS 端开发团队进行了摄像头切换(微距)问题的分析和解决。
本文从原理开始分析,通过层层拆解,把「微距实现」这个命题划分成为三个主要的解决目标:变焦系数、光照水平、焦点位置的确定。并围绕链路实现、性能、适配三个层面进行可行性验证,完成微距能力的落地。
下图:图1-4为部分 app 镜头页在 iPhone13 Pro Max 的近距离对焦表现,图5为应用了微距能力的拍立淘。


▐ 成像原理
焦距
为什么在我们对准某个物体的时候,有时候会出现画面的模糊,需要手动或自动对焦解决?这就要说到对焦。
对焦:当焦平面落在成像面(感光sensor)上时,图像是最清晰的。如果成像面在焦深范围之外,图像是模糊的。所以有时候为了获取清晰的成像,需要调焦。手动调焦(MF)或者是自动调焦(AF)。
自动调焦有多种方法:测距离法、反差检测法、PDAF相位检测法等等,苹果的Focus Pixels其实就是相位差对焦技术。
变焦
下图为iPhone 14 Pro Max具有的光学变焦和数码变焦能力。即当我们使用系统相机进行0.5~3倍焦距调节时候,是光学变焦,从3-15倍焦距调节的时候,是数码变焦。
多摄像头

▐ 苹果相机
iPhone成像系统概览
其中,有如下几个重要的技术更新点:
2014年,iPhone 6 Plus摄像头首次加入镜头光学防抖;
2016年,iPhone 7 Plus首次采用双摄方案(加入长焦镜头);
2019年,iPhone 11 Pro首次采用三摄方案(加入超广角镜头);
具体图表如下(图引):
无法对焦的的主要原因
问题分析
基于上述分析,得知苹果在硬件层面中,在带超广角的iPhone机型当中,是能够带给用户更好的微距体验。但是需要app支持。当前拍立淘业务中拍近距离物体会模糊的问题,拆解出主要有三个层面的问题待确认:
链路实现层面
不支持摄像头自动切换的原因是什么?
摄像头自动切换需要具备哪些条件?
与业务现有链路如何融合?
性能层面:
是否会造成内存的增加?
是否会造成CPU的增加?
适配层面
对于不同机型、不同系统版本,需要什么策略适配?
▐ 链路实现层面
不支持摄像头自动切换的原因是什么?
其中,涉及到此问题的关键步骤为生成AVCaptureDevice
。
AVCaptureDevice 在整个视频采集过程中提供实现摄像头和麦克风相关初始化,并可以对摄像头进行一些基本设置,如:闪光灯、手电筒、聚焦、曝光、白平衡等一些基本设置。
原有的生成device逻辑,是调用系统方法devicesWithMediaType:
,而这个方法在iOS10之后已经废弃。对于需要利用新设备上的多摄像头自动切换,使用这个接口是不能达到目的。根据API的提示,需要采用新的AVCaptureDeviceDiscoverySession:
支持摄摄像头自动切换需要具备哪些条件?
要实现自动切换,就要调用新的接口。在使用方式上,我们也遇到了一些理解难点,下面是过程记录。
首先从这个新接口入手,他的入参有三个:deviceTypes、mediaType、position。其中:
mediaType是设备的媒体类型。比如音频、文本等,这里自然就选择AVMediaTypeVideo。
position是相机的位置是前置还是后置。根据不同的业务需要,拍立淘主要的流量场景是AVCaptureDevicePositionBack。
deviceTypes是可以获取的相机设备内容。他的可选项比较多,需要根据系统版本区分选择。这次我们要解决的是微距,因此需要增加超广角的获取。我们主要把目光注意到AVCaptureDeviceTypeBuiltInDualWideCamera上,而对于不支持的设备,我们做好适配和兜底即可。
/**
AVCaptureDeviceTypeBuiltInWideAngleCamera 广角(默认设备,28mm左右焦段)
AVCaptureDeviceTypeBuiltInTelephotoCamera 长焦(默认设备的2x或3x,只能使用AVCaptureDeviceDiscoverySession获取)
AVCaptureDeviceTypeBuiltInUltraWideCamera 超广角(默认设备的0.5x,只能使用AVCaptureDeviceDiscoverySession获取)
AVCaptureDeviceTypeBuiltInDualCamera (一个广角一个长焦(如iPhone7P,iPhoneX),可以自动切换摄像头,只能使用AVCaptureDeviceDiscoverySession获取)
AVCaptureDeviceTypeBuiltInDualWideCamera (一个超广一个广角(如iPhone12 iPhone13),可以自动切换摄像头,只能使用AVCaptureDeviceDiscoverySession获取)
AVCaptureDeviceTypeBuiltInTripleCamera (超广,广角,长焦三摄像头(如iPhone11ProMax iPhone12ProMax iPhone13ProMax)可以自动切换摄像头,只能使用AVCaptureDeviceDiscoverySession获取)
AVCaptureDeviceTypeBuiltInTrueDepthCamera (红外和摄像头,能够获取景深数据(如iPhone12ProMax iPhone13ProMax))
*/
根据Apple Doc,我们对AVCaptureDeviceTypeBuiltInDualWideCamera有进一步的了解:
AVCaptureDeviceTypeBuiltInDualWideCamera(地址:https://developer.apple.com/documentation/avfoundation/avcapturedevicetypebuiltindualwidecamera?language=objc)
一种由两个固定焦距组成的设备:一个超广角和一个广角的摄像头组成的设备。
内置双摄像头支持以下功能:
当变焦系数、光照水平和焦点位置允许时,自动从一台摄像机切换到另一台摄像机。
通过测量超广角和广角相机拍摄的图像之间的差异来生成深度数据。
通过单个照片捕获请求从组成的超广角和广角设备传送照片。
这里就引出了本轮问题的解决点:
当变焦系数、光照水平和焦点位置允许时,自动从一台摄像机切换到另一台摄像机。
videoZoomFactor
该属性是一个用于控制AVCaptureDevice的图像的裁剪和放大的值;它是一个乘数:例如,值 2.0 会使图像主体的大小加倍(并使视野减半)。允许的值范围从 1.0(完整视野)到活动格式AVCaptureDeviceFormat的属性videoMaxZoomFactor值。
AVCaptureDevice通过围绕传感器捕获的图像的中心进行裁剪来实现缩放效果。在低缩放系数下,裁剪的图像等于或大于输出大小。在较高的缩放系数下,设备必须将裁剪后的图像缩放到输出尺寸,从而导致图像质量下降。活动格式AVCaptureDeviceFormat的videoZoomFactorUpscaleThreshold属性指示将进行放大的因素。
方案一:
通过使用拍立淘现有变焦工具,我们得以一览在使用了AVCaptureDeviceTypeBuiltInDualWideCamera获取到device后,videoZoomFactor在1-3.5范围内的视频流预览内容情况。实验结论来看,在采用自动设置焦点位置的和变焦在2倍的情况下,会出现镜头画面的切换。视频3秒处(主摄->超广角)和9秒处(超广角->主摄),效果如下:
方案一采用的是调参验证的方式,实际上在AVCaptureDevice的API中,就有关于这个zoomFactor准确值的取法。
/*!
@property virtualDeviceSwitchOverVideoZoomFactors
@abstract
An array of video zoom factors at or above which a virtual device (such as the Dual Camera) may switch to its next constituent device.
@discussion
This array contains zoom factors at which one of the constituent device's field of view matches the next constituent device's full field of view. The number of switch over video zoom factors is always one less than the count of the constituentDevices property, and the factors progress in the same order as the devices listed in that property. On non-virtual devices this property returns an empty array.
*/
@property(nonatomic, readonly) NSArray<NSNumber *> *virtualDeviceSwitchOverVideoZoomFactors API_AVAILABLE(ios(13.0), macCatalyst(14.0)) API_UNAVAILABLE(macos, tvos) API_UNAVAILABLE(watchos);


可以看出,图二和图三可以看到基本处于同一个场景下进行的镜头切换,验证了videoZoomFactor的赋值方式可行。
与业务现有链路如何融合?
▐ 性能层面
▐ 适配层面

通过上述链路的开发,可以看下在拍立淘镜头页进行图搜的效果如下,在微距能力具备之前,近距离进行图搜,会因主图模糊而导致主体识别有误。
下图:商品识别的前后对比(左:不含微距能力;右:使用了微距能力)
总结和展望
本次问题的源头也是来自用户的微距体验不佳,我们对问题深入分析,适当拆解。通过 Apple Development Doc 的查阅及实践,一步步抽丝剥茧,最终完美解决用户的体验痛点,也为我们自身沉淀了展示微距的能力。该能力无论是对于用户体验亦或是结果的召回都有着极大的改善。后续我们还会持续观测该改变带来的业务数据的提升。用户体验对于业务可以消极对待,也可以用积极的行动应对。只要有解决用户痛点的决心,相信任何微小的改变都会带来业务新的活力。
团队介绍
我们是大淘宝技术搜索推荐移动端团队,负责集团核心电商搜索推荐,图像视频搜索业务研发、技术平台建设、新业务和前沿技术探索等工作,我们负责的业务拥有亿级流量,能为您提供巨大的机遇和成长空间,期待您的加入。
感兴趣的同学可将简历发送到 taozi.ly@taobao.com
本文分享自微信公众号 - 大淘宝技术(AlibabaMTT)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。