为什么那些“辣鸡” Android App 对不上焦?

转自https://weibo.com/ttarticle/p/show?id=2309404354435676506532
众所周知很多国产 App iOS 版本的表现显著好于 Android 版本,其中除了 Android 本身的原因之外,究竟还有什么原因导致了这些体验差异?本文将以相机部分为例分析那些“辣鸡” Android App 的问题以及影响,希望这些 App 能尽早按规范使用 API,达成更好的体验。
尽管 Android Camera 2 API 推出已久,但由于底层软件等各种原因支持不完善,所以目前大多 App 仍然使用 Camera 1 API,本文也仅以 Camera 1 API App 为例。

由于偏技术向,首先需要解释以下名词:
Focus mode:对焦模式,App 可根据需要设定不同的对焦模式。对于 App 开发者而言有以下几种比较容易混淆的对焦模式:AUTO、CONTINUOUS_PICTURE、CONTINUOUS_VIDEO
AUTO:非常具有迷惑性的选项,看起来是自动对焦,实则设置为该模式后,只有当 App 主动要求对焦,相机才会对焦一次,对焦完成后不会再自动重新触发对焦
CONTINUOUS_PICTURE:连续自动对焦,当相机算法检测到场景发生变化需要重新对焦时,就会自动触发对焦,不需要 App 控制,系统自带相机通常使用这种模式
CONTINUOUS_VIDEO:同上,只是触发对焦和对焦过程都较为缓和,通常用于录像

Focus area(region):对焦区域,默认为中心对焦,App 也可根据需要设定对焦区域(就和你在系统自带相机里点击对焦一样啦)。根据 Android 官方文档介绍,对焦区域坐标基于 CMOS 方向的左上角

Each focus area is a rectangle with specified weight. The direction is relative to the sensor orientation, that is, what the sensor sees. The direction is not affected by the rotation or mirroring of Camera.setDisplayOrientation(int). Coordinates of the rectangle range from -1000 to 1000. (-1000, -1000) is the upper left point. (1000, 1000) is the lower right point.

即当整个坐标体系应该是如下图所示
image
即使是竖屏 App,设定对焦、测光等坐标时,仍然是以传感器方向的坐标系为准,而不是屏幕方向不是屏幕方向不是屏幕方向不是屏幕方向不是屏幕方向
image

首先我要给所有第三方 App 一个建议
非必要情况下,使用 CONTINUOUS_PICTURE 或 CONTINUOUS_VIDEO,不要设置 Focus area ,才能得到最快速且体验良好的对焦(这其中涉及到 PDAF 、激光辅助对焦等限制),尤其是扫码类 App!
必须设置 Focus area 时,仔细认真阅读 Android 官方文档!

先来看一个没问题的App,随手翻了下手机来看下百度搜索那个拍照功能
首先是正确设定AF模式(这里的3 = ControlAFModeContinuousVideo):
camxcafioutil.cpp:1411 ReadFocusMode() HALFocusMode = 3, AlgoFocusMode = 2, SceneMode = 1
然后是用户不点击画面对焦时没有设置任何 Focus area
当用户点击画面对焦时,设置的 Focus area 坐标也比较正确,对焦框大小设置也相对合理
以下是点击竖持手机的右上角,即CMOS方向的左上角,传感器分辨率为4000x3000
camxcafioutil.cpp:834 RetrieveFocusRegions() ROI type 2 ROIWeight 1000 (L:122,T:574,W:600,H:300)
以下是点击竖持手机的右下角,即CMOS方向的右上角
camxcafioutil.cpp:834 RetrieveFocusRegions() ROI type 2 ROIWeight 1000 (L:2568,T:500,W:600,H:273)

那么说完这些,问题就来了,我们逐一来看热门 App 的行为到底是什么样的呢?为什么体验不好呢?
微信(7.0.3):
扫一扫
首先是扫一扫功能非常热衷于设定 Focus Area ,而且设定的对焦区域大小非常神奇,几乎相当于整个画面大小
camxcafioutil.cpp:834 RetrieveFocusRegions() ROI type 2 ROIWeight 1000 (L:300,T:987,W:3400,H:1026)
而且当进入扫一扫2秒之后,连对焦模式都会从刚进入时的CONTINUOUS_VIDEO变为AUTO
03-27 10:46:07.619 733 1151 V CamX : [ VERB][STATS_AF] camxcafioutil.cpp:1411 ReadFocusMode() HALFocusMode = 3, AlgoFocusMode = 2, SceneMode = 1

03-27 10:46:09.877 733 1146 V CamX : [ VERB][STATS_AF] camxcafioutil.cpp:1411 ReadFocusMode() HALFocusMode = 1, AlgoFocusMode = 0, SceneMode = 1

上面提到设定为 AUTO 后,除非 App要求对焦,相机算法是不会再根据场景变化自动重新对焦的了,所以微信又做了个神操作,每2秒由 App 重新触发一次对焦

03-27 10:50:01.010 733 1147 V CamX : [ VERB][STATS_AF] camxcafstatsprocessor.cpp:1132 MapControlAFTriggerToAFStateTransition() [NightCoffee] Trigger AF
03-27 10:50:03.009 733 1149 V CamX : [ VERB][STATS_AF] camxcafstatsprocessor.cpp:1132 MapControlAFTriggerToAFStateTransition() [NightCoffee] Trigger AF

03-27 10:50:04.875 733 1147 V CamX : [ VERB][STATS_AF] camxcafstatsprocessor.cpp:1132 MapControlAFTriggerToAFStateTransition() [NightCoffee] Trigger AF

于是扫一扫就产生了N个问题

  1. Focus area 设置过大,实际合焦点可能并不在UI显示的扫码框内
  2. AF mode为AUTO模式,每隔两秒才会重新触发一次对焦,意味着当距离发生变化时最长需要等2秒才能重新对上焦
  3. 由于设置了 Focus area,有部分手机此时激光辅助或相位辅助会失效,对焦变慢
    小视频
    到了小视频,默认情况下倒看起来都非常正常,Focus area未设置,AF mode设置为ControlAFModeContinuousPicture
    camxcafioutil.cpp:1411 ReadFocusMode() HALFocusMode = 4, AlgoFocusMode = 1, SceneMode = 1
    然而当你点击画面时又出问题了,当你竖持手机,点击画面右上角时:
    camxcafioutil.cpp:834 RetrieveFocusRegions() ROI type 2 ROIWeight 1000 (L:3266,T:424,W:160,H:120)
    点击右下角时:
    camxcafioutil.cpp:834 RetrieveFocusRegions() ROI type 2 ROIWeight 1000 (L:3488,T:1978,W:160,H:120)
    暂且不说这个对焦框设置的有多么迷你(160x120),导致对焦失败率大大提升
    这坐标是咋回事?可以看到从系统底层转换到最终对焦区域的 Log 来看,只有 Top 坐标发生了比较大的变化,而如果微信按 Android 规范设定坐标,竖持手机的右上角和右下角转换到 CMOS 方向后应该只有 Left 有较大区别,显然微信是直接用了屏幕坐标系当成了相机的坐标系

image.png
支付宝(10.1.59.231):

扫码
AF mode设置上没有问题,但是设置了一个Focus area
ReadFocusMode() HALFocusMode = 4, AlgoFocusMode = 1, SceneMode = 1
RetrieveFocusRegions() ROI type 2 ROIWeight 1000 (L:1124,T:691,W:1616,H:1617)
这个 Focus area 也过分的大了……对于部分手机来说各种辅助对焦手段也会失效

微博(9.3.2):
微博故事、发围脖时调用拍照、拍视频
和微信小视频一样的坐标问题,而且对焦框大小更过分……
camxcafioutil.cpp:834 RetrieveFocusRegions() ROI type 2 ROIWeight 1000 (L:1958,T:1707,W:222,H:61)

扫一扫
AF mode设置为了AUTO,但是好在没设置 Focus area,而且强制触发对焦的机制比微信智能且快速一些,最长4秒强制触发一次,但如果画面内容有变化时能很快触发,体验上要比微信好不少但不是最佳
camxcafioutil.cpp:1411 ReadFocusMode() HALFocusMode = 1, AlgoFocusMode = 0, SceneMode = 1

京东:
扫一扫
和围脖的扫一扫一个样,但没围脖触发频繁

淘宝:
扫一扫
嘿,淘宝也是完全OJBK的,正确的AF mode,未设置AF area
camxcafioutil.cpp:1411 ReadFocusMode() HALFocusMode = 4, AlgoFocusMode = 1, SceneMode = 1

综上所述,如果你不知道正常的相机扫码对焦体验应该是什么样的,可以打开淘宝或百度内的相机看看,再与其他 App 对比一下,应该都能感受出来。
由于上述这些 App 在国内过于流行,用户遇到问题时投诉基本都汇集到了手机厂商而不是 App 开发者,部分手机厂商为了降低用户投诉量,不得已根据这些 App 的错误行为去修改系统行为,但这显然无益于推进 App 厂商自身改进,甚至为 App 开发者提供了充足的借口:“你看那个大厂的品牌都没问题,肯定是你自己问题啦 反正我没问题”

【附】相关架构及资料

在这里插入图片描述
在这里插入图片描述

资料领取

关注+点赞+加群:1007478004 免费获取!

群里还有往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术

猜你喜欢

转载自blog.csdn.net/weixin_44941011/article/details/89471675
今日推荐