写在前面
二维码是一个近几年来移动设备上超流行的一种编码方式(又称二维条码,QR Code,QR全称QuickResponse),它比传统的条形码(Bar Code)能存更多的信息,也能表示更多的数据类型。随着二维码的流行,几乎大部分手持设备和移动APP都支持二维码的扫描识别。在爱奇艺移动端,二维码主要功能是连接PC客户端,网页端,TV端的工具,可以快速引导用户账号登录,会员等付费业务的支付,运营活动的打通,小程序的入口等。为了给用户提供更快捷便利的体验,爱奇艺技术产品团队针对二维码扫码性能进行了专项优化,识别率从最初的30%提升到了75%左右,平均耗时从2.1s下降到722ms。下文将详细分享爱奇艺在扫码优化实践方面的经验。
背景
二维码因其成本低,兼容性好,存储信息更多等优势成为了线上线下主要的连接工具,并且在移动设备交互上提供了更快捷入口。对于大部分标准清晰的二维码场景,使用开源的ZXing或ZBar库就可以很好的完成二维码的识别。但是由于二维码是一种点阵式信息编码方式,任何视觉上的缺失,弯曲变形,光照,屏幕噪点等都会极大的干扰影响识别成功率和速度,影响了用户体验和转化率。碰到一些特殊的场景,ZXing/ZBar因识别率不高,难以满足业务的需求。
这些特殊场景主要包括以下几方面:
1、二维码是深色背景的,周边带有黑框,没有明显的分界线
2、二维码是灰色的,对比度很低
3、二维码拉伸变形,倾斜扭曲
4、由于光照干扰,二维码图像光照不均,局部区域过暗
原本爱奇艺APP直接集成的开源的ZXing库实现扫码功能,并没有做过多的定制和优化,这些场景下识别体验较差。因此开始了二维码扫码性能优化之路,针对各种场景进行逐一分析优化,经过2~3个版本的迭代,爱奇艺APP扫码性能指标有了质的提升,内部样本集性能测试结果显示,识别率从最初的30%提升到了75%左右,平均耗时从2.1s下降到722ms。主要从三个方面进行了针对性优化: (1) 扫描速度优化 (2) 交互体验优化 (3) 识别率优化。
由于二维码样本集的差异,测试性能数据仅供参考:
版本 |
成功率 |
平均耗时(ms) |
V10.11.0 |
75% |
722.18 |
V10.10.0 |
48% |
1471.9 |
V10.9.0 |
30% |
2096.7 |
扫码速度优化
1. 去除不必要的格式转换和旋转操作
在分析代码时,发现原有的逻辑在相机帧`onPreviewFrame()`回调里处理帧像素时,先把YUV数据格式转换成了RGB格式,同时由于横竖屏的关系,对像素数组进行了90°旋转操作,然后把处理好的像素数组传递给`RGBLuminanceSource`,交给ZXing解码。经过断点分析,发现YUV转RGB和旋转这两步耗费了大量时间,预览数组越大耗时越长。
ZXing本身提供了`YUVLuminanceSource`可以直接解码YUV数据,在YUV格式中Y分量就是灰度分量,对比度相比RGB更高,直接把YUV格式的data数据交给ZXing解码