一种提升基于Anroid Camera API1/HAL1开发的相机应用拍照缩率图生成效率的实现方案

从上家公司离职了一段时间了,总结下之前做的一种提升拍照缩率图生成效率的实现方案

开发环境:

  1. Android qcom 系列平台
  2. Camera APK基于Camera API1 开发
  3. Camera HAL为HAL1

一般的拍照流程如下(好久不看HAL1了,只给出简图):

在这里插入图片描述
从该时序图上看,每次应用下发拍照命令后,HAL1 都会回调两次数据

  1. 原始拍照数据CAMERA_MSG_RAW_IMAGE,格式为NV21
  2. 编码数据CAMERA_MSG_COMPRESSED_IMAGE,格式为jpeg

一般情况下,相机应用生成缩略图机制是在收到CAMERA_MSG_COMPRESSED_IMAGE数据后,再将其生成bitmap,然后显示缩略图,
该过程存在两处,甚至是三处较大耗时:

  • jpeg编码耗时
  • jpeg 转换为bitmap耗时
  • 如果encodeData存在三方算法,还需要添加该耗时

为提升缩略图的生成效率,给用户一个拍照速度快的体验,小编采取的方案是:

  1. 使用 dataCallback(CAMERA_MSG_RAW_IMAGE)上报的NV21数据来生成缩略图
  2. 将encodeData中的算法处理移动至dataCallback(CAMERA_MSG_RAW_IMAGE)之后
  3. 使用libyuv库1,在Native层将NV21数据快速缩小,旋转,转码为ABGR2,生成bimap

  1. libyuv库集成了很多处理yuv的高效方法,比网上搜索到的很多通过yuv转rgb公式写的方法效率高很多 ↩︎

  2. 虽然创建bitmap时传递格式为Bitmap.Config.ARGB_8888,但是内存中数据排列顺序是ABGR,在这个格式上,小编探索了一下午!!! ↩︎

猜你喜欢

转载自blog.csdn.net/u010116586/article/details/91482232