Android

关注公众号 jb51net

关闭
首页 > 软件编程 > Android > Android Camera API

Android Camera API作用及使用指南

作者:aningxiaoxixi

StreamConfigurationMap和OutputConfiguration是AndroidCamera2API中用于描述和配置相机输出流的关键类,本文介绍Android Camera API作用及使用指南,感兴趣的朋友一起看看吧

一 StreamConfigurationMap

1. StreamConfigurationMap 的作用

StreamConfigurationMap 是 Android Camera2 API 中的一个核心类,用于描述相机设备支持的输出流配置,包含以下信息:

应用通过 CameraCharacteristics 获取 StreamConfigurationMap,并基于此配置合理的 CaptureSession(例如选择预览和拍照的兼容分辨率)。

2. 与 cameraprovider 交互关系

(1) 数据来源

Camera HAL 实现(如 android.hardware.camera.provider@2.4)通过 getCameraCharacteristics() 方法向框架上报硬件能力,包括支持的流配置(格式、分辨率、动态范围等)。

框架层(如 CameraService)解析 HAL 返回的元数据,将其转换为应用可直接使用的 StreamConfigurationMap

(2) 配置流程示例

(3) 关键数据结构对应

HAL 元数据字段(如 android.scalerStreamConfigurationMap 方法作用
SCALER_AVAILABLE_STREAM_CONFIGURATIONSgetOutputSizes(int format)获取某格式支持的分辨率列表
SCALER_AVAILABLE_MIN_FRAME_DURATIONSgetOutputMinFrameDuration(int format)获取某分辨率下最小帧间隔(决定最大帧率)
REQUEST_AVAILABLE_CAPABILITIESisOutputSupportedFor(int useCase)检查是否支持特定用例(如 ZSL)

3. 实际示例

假设一个相机设备支持以下配置(通过 CameraProvider 上报):

StreamConfigurationMap 会生成如下信息:

// 获取 YUV 格式支持的分辨率
Size[] yuvSizes = streamConfigMap.getOutputSizes(ImageFormat.YUV_420_888);
// 结果: [1920x1080, 1280x720]
// 检查是否支持硬件级 YUV 重处理
boolean isReprocessSupported = streamConfigMap.isOutputSupportedFor(
    CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING);

StreamConfigurationMap 是应用层获取相机输出能力的接口,而 CameraProvider 是底层硬件能力的提供者。前者依赖后者上报的元数据,二者共同实现 硬件能力到应用接口的透明映射,是 Android Camera 系统分层架构的核心设计之一。

在 Android 相机系统(Camera2 API)中,OutputConfigurationStreamConfigurationMap 是与相机输出流配置相关的两个关键类,它们在相机工作流程中扮演不同角色。以下是它们的详细介绍及关系分析:

二. OutputConfiguration

1 作用

作用

OutputConfiguration 是 Android 5.0(API 21)引入的类,用于定义单个相机输出流的配置。它的核心功能包括:

// 创建 ImageReader 并获取 Surface
ImageReader imageReader = ImageReader.newInstance(width, height, format, maxImages);
Surface imageSurface = imageReader.getSurface();
// 创建 OutputConfiguration
OutputConfiguration outputConfig = new OutputConfiguration(imageSurface);
// 可选:配置共享 Surface 或物理相机
// outputConfig.addSurface(anotherSurface);
// outputConfig.setPhysicalCameraId("2");
// 创建 CameraCaptureSession
List<OutputConfiguration> outputConfigs = new ArrayList<>();
outputConfigs.add(outputConfig);
cameraDevice.createCaptureSessionByOutputConfigurations(outputConfigs, callback, handler);

2. 与 StreamConfigurationMap 关系

协作流程

依赖关系

扩展功能

3. 常见问题

Q1: 为什么需要同时使用两者?
A: StreamConfigurationMap是相机设备的“能力说明书”,告诉开发者硬件支持哪些输出配置。OutputConfiguration是实际构建输出流的“施工图”,将合法的参数绑定到具体的Surface`。

二者配合确保相机输出流的正确性和高效性

Q2: 如何避免 InvalidSurfaceException
A: 确保 OutputConfigurationSurface 参数(格式、分辨率)在 StreamConfigurationMap 的合法范围内。

Q3: 多摄像头场景如何处理?
A: 使用 OutputConfiguration.setPhysicalCameraId() 指定物理摄像头,并通过 StreamConfigurationMap 检查该摄像头是否支持目标参数。

总结 StreamConfigurationMap 是相机设备的“能力说明书”,告诉开发者硬件支持哪些输出配置。OutputConfiguration 是实际构建输出流的“施工图”,将合法的参数绑定到具体的 Surface。二者配合确保相机输出流的正确性和高效性,是 Camera2 API 中不可或缺的组件。

在 Android Camera2 API 中,CameraCaptureSession 是管理相机数据流和捕获请求的核心组件。它与 OutputConfiguration 密切相关,共同决定了相机的输出目标(如预览、拍照、录像等)的配置和运行机制。以下是详细解释及其与 OutputConfiguration 的关系:

三 CameraCaptureSession

1. 作用

CameraCaptureSession 是相机设备(CameraDevice)与输出目标(Surface)之间的桥梁,负责:

管理输出流:绑定多个 Surface(如预览的 SurfaceView、拍照的 ImageReader),并确保数据正确传输到这些目标。

提交捕获请求:通过 capture()setRepeatingRequest() 发送请求(CaptureRequest),控制相机的行为(如自动对焦、曝光、帧率等)。

处理异步事件:监听相机状态(如对焦完成、帧捕获完成)并回调给应用。

2 生命周期

3.创建 CameraCaptureSession

创建会话时,需要指定一组输出目标(SurfaceOutputConfiguration)。两种方法:

传统方式(基于 Surface 列表):

cameraDevice.createCaptureSession(
    List<Surface> outputs,   // 直接传递 Surface 列表
    CameraCaptureSession.StateCallback callback, 
    Handler handler
);

适用于简单场景,但灵活性有限(例如不支持多摄像头或动态分辨率)。

基于 OutputConfiguration 的方式(API 21+,扩展功能在后续版本增强):

cameraDevice.createCaptureSessionByOutputConfigurations(
    List<OutputConfiguration> outputConfigurations,  // 封装了 Surface 的高级配置
    CameraCaptureSession.StateCallback callback,
    Handler handler
);

支持更复杂的配置(如共享流、物理摄像头绑定、动态分辨率等)。

4. 与 OutputConfiguration 的关系

(1) OutputConfiguration 是会话的输入

(2) 创建会话的流程

(3) 关键约束

5. 示例:使用 OutputConfiguration 创建会话

// 创建两个输出目标:预览 Surface 和拍照 ImageReader
SurfaceView surfaceView = ... // 预览的 SurfaceView
ImageReader imageReader = ImageReader.newInstance(4032, 3024, ImageFormat.JPEG, 3);
// 封装为 OutputConfiguration
OutputConfiguration previewConfig = new OutputConfiguration(surfaceView.getHolder().getSurface());
OutputConfiguration captureConfig = new OutputConfiguration(imageReader.getSurface());
// 可选:配置共享流或物理摄像头
// previewConfig.addSurface(anotherSurface); // 共享同一个流
// captureConfig.setPhysicalCameraId("1");    // 指定物理摄像头
List<OutputConfiguration> outputConfigs = new ArrayList<>();
outputConfigs.add(previewConfig);
outputConfigs.add(captureConfig);
// 创建 CameraCaptureSession
cameraDevice.createCaptureSessionByOutputConfigurations(outputConfigs, 
    new CameraCaptureSession.StateCallback() {
        @Override
        public void onConfigured(@NonNull CameraCaptureSession session) {
            // 会话就绪,可提交 CaptureRequest
        }
        @Override
        public void onConfigureFailed(@NonNull CameraCaptureSession session) {
            // 配置失败(参数不合法或硬件问题)
        }
    }, 
    null // 可选 Handler
);

6. 高级功能与兼容性

7. 常见问题与解决方案

总结

通过合理使用 OutputConfiguration,开发者可以更灵活地配置相机输出流,满足复杂场景的需求(如多摄、动态分辨率、低功耗共享流)。

到此这篇关于Android Camera API 介绍的文章就介绍到这了,更多相关Android Camera API内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文