旧Camera

Camera的方法一般是通过设置 camera.setPreviewDisplay() 将预览帧输出到SurfaceView,并通过接口 Camera.PreviewCallback 中的 onPreviewFrame() 获取预览帧数据。

对于华为M2,在1920x1080分辨率下也能保持相机支持的最高30fps的输出。

新Camera2

Camera2对这部分改动很大。通过 CameraCaptureSession.setRepeatingRequest() 开始预览,而传入的request则由 PreviewRequestBuilder 创建

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帧。