从上家公司离职了一段时间了,总结下之前做的一种提升拍照缩率图生成效率的实现方案
开发环境:
- Android qcom 系列平台
- Camera APK基于Camera API1 开发
- Camera HAL为HAL1
一般的拍照流程如下(好久不看HAL1了,只给出简图):
从该时序图上看,每次应用下发拍照命令后,HAL1 都会回调两次数据
- 原始拍照数据CAMERA_MSG_RAW_IMAGE,格式为NV21
- 编码数据CAMERA_MSG_COMPRESSED_IMAGE,格式为jpeg
一般情况下,相机应用生成缩略图机制是在收到CAMERA_MSG_COMPRESSED_IMAGE数据后,再将其生成bitmap,然后显示缩略图,
该过程存在两处,甚至是三处较大耗时:
- jpeg编码耗时
- jpeg 转换为bitmap耗时
- 如果encodeData存在三方算法,还需要添加该耗时
为提升缩略图的生成效率,给用户一个拍照速度快的体验,小编采取的方案是:
- 使用 dataCallback(CAMERA_MSG_RAW_IMAGE)上报的NV21数据来生成缩略图
- 将encodeData中的算法处理移动至dataCallback(CAMERA_MSG_RAW_IMAGE)之后
- 使用libyuv库1,在Native层将NV21数据快速缩小,旋转,转码为ABGR2,生成bimap