小米开放平台三方App相机无法对焦适配方案
1.问题现象
打开App扫一扫 -> 画面一直无法聚焦
2.问题分析
对焦失败的原因:第一次AFtrigger被reconfigure冲掉了,导致AF模块状态异常,一直无法对焦。
2.1.App的对焦方式
扫一扫采用auto方式对焦,即先设置AFMode=auto,然后周期性不断下发aftrigger(loop focus)来主动触发每一次对焦。原理如下:
图1 auto对焦原理图
2.2.configure_stream和reconfigure
- 什么是configure_stream
configure_stream是Cameraservice的行为。在open camera初始化阶段,Cameraservice会根据app的对分辨率、画幅、stream等需求向底层发送configure_stream的指令。通俗的讲,比如某个camera需要预览和yuv数据,那么在初始化阶段就需要将这些需求通知底层camera,Camera会根据这些需求搭建对应的硬件和软件资源,当底层准备完毕后,就可以开始接收app的request需求,并返回数据。
- 什么是reconfigure
当Cameraservice检测到app的需求发生变化时,便会触发reconfigure,将新的需求向底层发送configure_stream的指令。例如:一开始app只需要预览,那么Cameraservice就会向底层configure预览流,底层就会搭建好预览流的输出通道,过了几帧后,app又需要yuv了,于是就会执行reconfigure,此时会将上次configure的资源全部清除,并重新建立预览+yuv的通道。
2.3.微博的流程
以微博扫一扫为例分析不对焦的原因,不同app行为可能有所不同。
图2 微博扫一扫对焦流程图
一般对于扫码的场景,app会请求预览流(用于显示)和yuv流(用于处理、识别二维码),但由于yuv并不需要马上使用,因此,预览和yuv的请求可能会存在时间差。
- 为什么旧的机型这些app没有问题,在新平台上会有问题
根据以上分析可知,不对焦有两个条件,一是触发了reconfigure,二是reconfigure冲掉了第一次AFtrigger。因此对于很多app,reconfigure的问题一直存在,但reconfigure的时机具有随机性,如果第二次configure发生在第一次AFtrigger之前,就不会冲掉trigger,也就不会引起问题。
3.修复方案
通过与微博研发人员合作验证以下两种方案均可修复该问题:
- 方案1:将第一次触发AF的时机移到get yuv之后;
- 方案2:同时请求预览和yuv,避免时间差导致的reconfigure。
建议方案2,可以根源上解决问题。如下是微博的修复方案(不同app可苹果app打包能情况不一样,仅供参考):在startpreview()前执行setPreviewCallback(YUV)。
说明:在开启预览时app会调用startpreview()接口,如果在此之前调用setPreview Callback(),提前设置yuv的callback,这样便可以在预览时同时请求yuv流。否则,startpreview()只会请求预览流,当执行到setPreviewCallback(YUV),会触发reconfigure请求yuv。
编辑:yimen,如若转载,请注明出处:https://www.yimenapp.com/kb-yimen/12510/
部分内容来自网络投稿,如有侵权联系立删