根据业务需求,需要调用相机每秒抓取5帧以上的图片
1、通过安卓官网下载了关于camera2 使用的demo了解了拍照的流程
2、通过查阅资料将单次拍照改成了连拍主要是
CaptureSession.captureBurst
的使用
3、通过测试发现 连拍的效率平均不到2张每秒
4,通过获取预览帧的方式
旧Camera
Camera的方法一般是通过设置camera.setPreviewDisplay()
将预览帧输出到SurfaceView,并通过接口Camera.PreviewCallback
中的onPreviewFrame()
获取预览帧数据。
对于华为M2,在1920x1080分辨率下也能保持相机支持的最高30fps的输出。
新Camera2
Camera2对这部分改动很大。通过CameraCaptureSession.setRepeatingRequest()
开始预览,而传入的request则由PreviewRequestBuilder
创建
Java
mPreviewRequestBuilder.addTarget(surface);
表示将预览输出到surface,一般来说就是屏幕了。华为M2对这个是支持的,目测也应该是达到了30fps。
获取预览帧则由
mPreviewRequestBuilder.addTarget(mImageReader.getSurface());
得到,就是将预览帧同时发送给屏幕surface和ImageReader,其中发送给ImageReader的预览帧分辨率由ImageReader根据支持的分辨率指定。
然后问题就来了,当设置ImageReader为1440x1080时,运行APP会发现屏幕输出卡顿,且ImageReader获得预览帧速度明显不够30fps;选择不输出屏幕,只输出ImageReader时,获得预览帧速度也明显不够30fps。(测试ImageReader是通过ImageReader.OnImageAvailableListener
接口,在另一线程中处理获取到的Image,且获取到后Image后立即释放。)
5、测试发现预览帧冉冉没能解决问题,于是查阅资料发现这个是与生成图片的格式有关
于是将JPEG格式转换成YUV_420_888
Size largest = Collections.max(Arrays.asList(map.getOutputSizes(ImageFormat.YUV_420_888)),new CompareSizesByArea());
mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(), ImageFormat.YUV_420_888, /*maxImages*/2);
转换完了之后问题得到解决,每秒能够抓取的图片能够达到20帧。