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