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

Camera2 API设置30FPS仅获15FPS问题排查求助

Camera2 API 30FPS图像捕获帧率不足问题排查与解决

1. ImageReader缓冲区配置优化

  • 检查ImageReader.newInstance的maxImages参数,若设置过小(如默认2)会导致缓冲区填满后相机暂停输出,需设置为4-8以保证连续帧承接能力:
    ImageReader imageReader = ImageReader.newInstance(width, height, ImageFormat.YUV_420_888, 8);
    
  • 必须在onImageAvailable回调中及时关闭Image对象,处理完图像后立刻调用image.close(),否则缓冲区无法回收会阻塞后续帧输出:
    @Override
    public void onImageAvailable(ImageReader reader) {
        Image image = reader.acquireLatestImage();
        if (image == null) return;
        // 图像处理逻辑
        image.close(); // 释放缓冲区,关键操作
    }
    

2. CaptureRequest帧率参数修正

  • 正确配置帧率范围与自动曝光模式,确保相机明确收到30FPS的捕获指令:
    Range<Integer> fpsRange = new Range<>(30, 30);
    captureRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fpsRange);
    captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);
    
  • 先验证设备支持的帧率范围,避免硬设不兼容参数:
    StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
    Range<Integer>[] supportedFpsRanges = map.getHighSpeedVideoFpsRangesFor(width, height);
    // 遍历supportedFpsRanges,确认是否包含30-30的范围
    

3. 相机会话模式调整

  • 若使用高速捕获,需调用createConstrainedHighSpeedCaptureSession而非普通会话,适配设备高速捕获逻辑:
    cameraDevice.createConstrainedHighSpeedCaptureSession(Collections.singletonList(imageReader.getSurface()), stateCallback, null);
    
  • 避免同时绑定多个高负载Surface(如预览+ImageReader),若不需要预览则仅传入ImageReader的Surface,减少相机输出压力。

4. 图像处理线程优化

  • 禁止在onImageAvailable主线程中执行复杂图像处理,将逻辑移至独立子线程/线程池,避免阻塞回调接收:
    private final ExecutorService processExecutor = Executors.newSingleThreadExecutor();
    
    @Override
    public void onImageAvailable(ImageReader reader) {
        processExecutor.execute(() -> {
            Image image = reader.acquireLatestImage();
            if (image == null) return;
            // 子线程内完成图像解码、运算等操作
            image.close();
        });
    }
    

5. 设备兼容性验证

  • 通过StreamConfigurationMap.getOutputSizes(ImageFormat.YUV_420_888)获取设备支持的最优分辨率,部分中低端设备无法在高分辨率下维持30FPS,需切换至硬件支持的分辨率档位。
  • 检查系统后台负载,关闭占用CPU/GPU的后台应用,避免资源竞争影响相机输出。

帧率验证方法

添加时间戳日志确认帧率瓶颈环节(相机输出不足/处理阻塞):

private long lastFrameTime = 0;

@Override
public void onImageAvailable(ImageReader reader) {
    long currentTime = System.currentTimeMillis();
    if (lastFrameTime != 0) {
        Log.d("CameraFPS", "帧间隔: " + (currentTime - lastFrameTime) + "ms");
    }
    lastFrameTime = currentTime;
    // 后续处理逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:03:13