我使用新的camera2 API的FPS速率较低。特别,尽管从
中选择了最高FPS范围(30,30)characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
并设置为
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, bestFPSRange);
在我测试过的两种设备(三星S5和Xperia Z3 Compact)上,对于高图像分辨率,我得到的平均速率都低得多。这是我设置OnImageAvailableListener
的方法:
int format = ImageFormat.YUV_420_888;
Size largest = map.getOutputSizes(format)[0];
Log.d("Images", "sizes: " + Arrays.toString(map.getOutputSizes(format)));
mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(), format,
/* maxImages */50);
mImageReader.setOnImageAvailableListener(new OnImageAvailableListener() {
private int frames = 0;
private long initialTime = SystemClock.elapsedRealtimeNanos();
@Override
public void onImageAvailable(ImageReader reader) {
reader.acquireLatestImage().close();
frames++;
if ((frames % 30) == 0) {
long currentTime = SystemClock.elapsedRealtimeNanos();
long fps = Math.round(frames * 1e9 / (currentTime - initialTime));
Log.d("Image", "frame# : " + frames + ", approximately " + fps + " fps");
frames = 0;
initialTime = SystemClock.elapsedRealtimeNanos();
}
}
}, mBackgroundHandler);
[基本上,上面的if语句每30个样本获取一次平均FPS。实际上,在两个设备上的最高分辨率(1920x1080)上,我看到的fps范围均为15-20 fps。但是,在线上的其他人似乎表明,无论分辨率如何,都应该可以达到30fps,实际上,使用旧的不推荐使用的相机API,我可以在两台设备上以最高的分辨率获得30fps。那我想念什么呢?
我已经尝试了TEMPLATE(例如TEMPLATE_PREVIEW)和格式(例如ImageFormat.YUV_420_888)的所有组合。我忘了扭哪个旋钮?
HTC One M9
华为伴侣S
所有人都以1080p返回低帧速率(约15fps)。我发现其中一部手机LG G4支持完整档案。在那台设备上,即使在高帧尺寸下,我也能获得30fps。因此,我强烈怀疑在camera2 api的包装中存在开销,从而导致此问题。