android camera2 实战经验汇总
android camera2 简单介绍
从 Android 5.0 开始,Google 引入了一套全新的相机框架 Camera2 api,它相比较 Camera1 有以下优势:
1、可以获取更多的帧(预览/拍照)信息以及手动控制每一帧的参数
2、对Camera的控制更加完全(比如支持调整focus distance, 剪裁预览/拍照图片)
3、支持更多图片格式(yuv/raw)以及高速连拍
4、…
现在是 2022 年了,可以说 99% 以上的安卓手机都在 5.0 系统,因此完全不用担心兼容问题。本文只是记录在自定义 camera2 实现连拍过程的坑,具体有关 camera2 的介绍可以参考 Google 的文档。
camera2 实现连拍并保存
理论上 camera2 连拍可以达到 30fps,笔者需要的速度是 20s 拍 100 张并保存,实测无压力。主要是使用 CountDownTimer 定时 build CaptureRequest,然后在 CaptureResult 中使用 RxJava 线程调度,即在 IO 线程保存照片,在 UI 线程更新。
遇到的一些问题
预览正常,保存的照片旋转了 90 度
解决办法有两个,第一个就在在 CaptureRequest 中构建 bitmap,然后强行使这个 bitmap 旋转到原来的位置。
1 | public Bitmap adjustPhotoRotation(Bitmap bm, final int orientationDegree) { |
第二个是 requestBuilder 设置 JPEG_ORIENTATION,这种才是解决根本
1 | public int getDisplayRotation(Activity activity) { |
CaptureRequest$Builder NPE
完整报错信息是:
1 | Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.hardware.camera2.CaptureRequest$Builder android.hardware.camera2.CameraDevice.createCaptureRequest(int)' on a null object reference |
这是因为,相机驱动相关初始化后要延迟 1s 左右才能 buildCaptureRequest,post 一个延时 1s 的 runnable 即可
部分机型上界面拉伸,保存正常
试了很多,暂无解,待填
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 BuyiXiao's Blog!
评论
ValineDisqus