You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Android CameraX ImageAnalysis设置帧率以提升至30FPS?

如何将CameraX ImageAnalysis帧率从10FPS提升至30FPS?

我希望提升ImageAnalysis组件的帧率,目前通过控制台日志查看,其帧率最高仅约10FPS,请问如何将其提升至30FPS?我了解到CameraX ImageAnalysis设置帧率没有统一方法,但仍希望能得到帮助,谢谢!

用户提供的代码如下:

void bindPreview(@NonNull ProcessCameraProvider cameraProvider) {

        final String TAG = "FPSCounter";
        final long[] startTime = {System.currentTimeMillis()};
        final int[] frameCount = {0};

        new Timer().scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                long elapsedTime = System.currentTimeMillis() - startTime[0];
                double fps = (double) frameCount[0] / (elapsedTime / 1000.0);
                Log.d(TAG, "FPS: " + String.format("%.2f", fps));
                frameCount[0] = 0;
                startTime[0] = System.currentTimeMillis();
            }
        }, 1000, 1000);

        Preview preview = new Preview.Builder().build();
        ImageAnalysis imageAnalysis = new ImageAnalysis.Builder()
                .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
                .build();

        imageAnalysis.setAnalyzer(ContextCompat.getMainExecutor(this), image -> {
            // This method will be called every time a new frame is available
            // You can use the 'image' object to get the current frame

            frameCount[0] = frameCount[0] + 1;

            image.close();
        });

        CameraSelector cameraSelector = new CameraSelector.Builder()
                .requireLensFacing(CameraSelector.LENS_FACING_BACK)
                .build();

        previewView = (PreviewView) findViewById(R.id.previewView);

        preview.setSurfaceProvider(previewView.getSurfaceProvider());

        Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner) this, cameraSelector, preview, imageAnalysis);
    }

优化方案

1. 为ImageAnalysis指定明确的帧率范围与分辨率

CameraX默认会根据绑定的用例协商相机参数,但你可以主动指定目标帧率范围和合适的分辨率,强制相机输出更高帧率:

ImageAnalysis imageAnalysis = new ImageAnalysis.Builder()
        .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
        .setTargetResolution(new Size(1280, 720)) // 选择平衡性能与清晰度的分辨率,过高会增加处理负担
        .setTargetFpsRange(30, 30) // 固定要求30FPS的输出范围
        .build();

注意:设备需支持该帧率范围,可提前查询验证:

CameraCharacteristics characteristics = cameraProvider.getCameraCharacteristics(cameraSelector);
Range<Integer>[] fpsRanges = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
// 遍历fpsRanges确认是否存在包含30FPS的区间

2. 改用独立线程执行分析逻辑

当前使用主线程执行分析,主线程的UI操作会阻塞帧处理,导致帧率下降。改用独立线程池:

ExecutorService analyzerExecutor = Executors.newSingleThreadExecutor();
imageAnalysis.setAnalyzer(analyzerExecutor, image -> {
    frameCount[0]++;
    image.close();
});

// 页面销毁时记得关闭线程池
@Override
protected void onDestroy() {
    super.onDestroy();
    analyzerExecutor.shutdown();
}

3. 修复帧率统计的线程安全问题

当前的frameCount在多线程中修改,存在计数不准的问题,改用原子类保证线程安全:

final AtomicInteger frameCount = new AtomicInteger(0);
final long[] startTime = {System.currentTimeMillis()};

new Timer().scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        long elapsedTime = System.currentTimeMillis() - startTime[0];
        double fps = (double) frameCount.getAndSet(0) / (elapsedTime / 1000.0);
        Log.d(TAG, "FPS: " + String.format("%.2f", fps));
        startTime[0] = System.currentTimeMillis();
    }
}, 1000, 1000);

// 分析线程中更新计数
frameCount.incrementAndGet();

4. 同步Preview用例的参数设置

如果Preview用例的参数(分辨率、帧率)较低,会拉低整个相机会话的输出规格,为Preview也设置匹配的参数:

Preview preview = new Preview.Builder()
        .setTargetResolution(new Size(1280, 720))
        .setTargetFpsRange(30, 30)
        .build();

5. 轻量化分析逻辑

如果后续添加图像处理操作,需确保逻辑足够高效:

  • 禁止在分析方法中执行IO操作、UI更新
  • 优先使用硬件加速的图像处理API(如RenderScript、ML Kit硬件加速)

内容的提问来源于stack exchange,提问作者Hoakin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 17:22:55