Camera2 的低 FPS API
Low FPS with Camera2 API
我在使用新相机 2 api 时 FPS 率很低。具体来说,
尽管从
中选择了最高的 FPS 范围 (30,30)
characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
并设置为
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, bestFPSRange);
在我测试过的两种设备(Samsung 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_PREVIEW)和格式(例如ImageFormat.YUV_420_888)的所有组合。我忘记拧哪个旋钮了?
S5 和 Z3 Compact 被归类为 LEGACY 设备。我在其他 LEGACY 设备上测试了这段代码,包括
三星 Galaxy S5
Xperia Z3 Compact
HTC One M9
华为Mate S
它们都在 1080p 时返回低帧率(大约 15fps)。我找到的其中一款手机 LG G4 支持 FULL 配置文件。在那台设备上,我甚至能够在高帧尺寸下获得 30fps。所以我强烈怀疑 camera2 api 的包装器中存在导致此问题的开销。
我在使用新相机 2 api 时 FPS 率很低。具体来说, 尽管从
中选择了最高的 FPS 范围 (30,30)characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
并设置为
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, bestFPSRange);
在我测试过的两种设备(Samsung 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_PREVIEW)和格式(例如ImageFormat.YUV_420_888)的所有组合。我忘记拧哪个旋钮了?
S5 和 Z3 Compact 被归类为 LEGACY 设备。我在其他 LEGACY 设备上测试了这段代码,包括
三星 Galaxy S5
Xperia Z3 Compact
HTC One M9
华为Mate S
它们都在 1080p 时返回低帧率(大约 15fps)。我找到的其中一款手机 LG G4 支持 FULL 配置文件。在那台设备上,我甚至能够在高帧尺寸下获得 30fps。所以我强烈怀疑 camera2 api 的包装器中存在导致此问题的开销。