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 的包装器中存在导致此问题的开销。