Android Camera API 介绍
一 StreamConfigurationMap
1. StreamConfigurationMap 的作用
StreamConfigurationMap 是 Android Camera2 API 中的一个核心类,用于描述相机设备支持的输出流配置,包含以下信息:
- 支持的格式与分辨率:例如
YUV_420_888、JPEG、RAW等格式及其对应的分辨率列表。 - 输入/输出流组合规则:例如哪些格式可以同时用于
预览、拍照或录像。 - 硬件能力限制:例如是否支持
硬件级图像处理(如YUV 重处理)、动态范围模式(HDR)等。 - 帧率与时长限制:如某些分辨率下支持的最小/最大帧率,或视频录制的最大时长。
应用通过 CameraCharacteristics 获取 StreamConfigurationMap,并基于此配置合理的 CaptureSession(例如选择预览和拍照的兼容分辨率)。
2. 与 cameraprovider 交互关系
(1) 数据来源
- CameraProvider 提供原始数据:
Camera HAL 实现(如android.hardware.camera.provider@2.4)通过getCameraCharacteristics()方法向框架上报硬件能力,包括支持的流配置(格式、分辨率、动态范围等)。 - 框架封装为 StreamConfigurationMap:
框架层(如CameraService)解析 HAL 返回的元数据,将其转换为应用可直接使用的StreamConfigurationMap。
(2) 配置流程示例
- 应用请求相机能力:
应用调用CameraManager.getCameraCharacteristics(cameraId)。 - 框架查询 HAL:
CameraService通过CameraProvider的 HAL 接口获取该相机的元数据。 - HAL 返回底层配置:
CameraProvider从硬件或板级配置文件(如cam_board.xml)中读取支持的流配置,传递给框架。 - 构建 StreamConfigurationMap:
框架将原始数据(如SCALER_AVAILABLE_STREAM_CONFIGURATIONS)封装为StreamConfigurationMap对象。 - 应用使用配置:
应用根据StreamConfigurationMap选择兼容的流组合(例如同时支持1080p@30fps预览和12MP拍照)。
(3) 关键数据结构对应
HAL 元数据字段(如 android.scaler) | StreamConfigurationMap 方法 | 作用 |
|---|---|---|
SCALER_AVAILABLE_STREAM_CONFIGURATIONS | getOutputSizes(int format) | 获取某格式支持的分辨率列表 |
SCALER_AVAILABLE_MIN_FRAME_DURATIONS | getOutputMinFrameDuration(int format) | 获取某分辨率下最小帧间隔(决定最大帧率) |
REQUEST_AVAILABLE_CAPABILITIES | isOutputSupportedFor(int useCase) | 检查是否支持特定用例(如 ZSL) |
3. 实际示例
假设一个相机设备支持以下配置(通过 CameraProvider 上报):
- YUV_420_888: 1920x1080@30fps, 1280x720@60fps
- JPEG: 4000x3000@10fps
则 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)中,OutputConfiguration 和 StreamConfigurationMap 是与相机输出流配置相关的两个关键类,它们在相机工作流程中扮演不同角色。以下是它们的详细介绍及关系分析:
二. OutputConfiguration
1 作用
作用:
OutputConfiguration 是 Android 5.0(API 21)引入的类,用于定义单个相机输出流的配置。它的核心功能包括:
-
封装输出目标(如
Surface或SurfaceView)。 -
配置物理相机(在多摄像头设备中指定物理传感器)。
-
管理共享输出流(允许多个
Surface共享同一输出流)。 -
使用场景:
当创建CameraCaptureSession时,需传入一组OutputConfiguration对象,描述所有输出流。 -
关键方法:
addSurface(Surface surface):添加共享的Surface。setPhysicalCameraId(String id):指定物理相机(用于双摄/多摄设备)。getSurfaces():获取关联的Surface列表。
-
示例:
// 创建 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 关系
-
协作流程:
- Step 1:通过
StreamConfigurationMap查询设备支持的输出参数(格式、分辨率等)。 - Step 2:根据合法参数创建输出目标(如
ImageReader或SurfaceView)。 - Step 3:将输出目标封装到
OutputConfiguration,用于创建CameraCaptureSession。
- Step 1:通过
-
依赖关系:
OutputConfiguration的参数(如格式、分辨率)必须符合StreamConfigurationMap的约束,否则会话创建会失败。StreamConfigurationMap提供理论支持,OutputConfiguration负责实际配置。
-
扩展功能:
OutputConfiguration支持高级功能(如多摄像头共享输出流),而StreamConfigurationMap仅描述硬件能力。- 在 Android 10(API 29)后,
OutputConfiguration新增对动态分辨率、物理摄像头绑定的支持。
3. 常见问题
-
Q1: 为什么需要同时使用两者?
A:StreamConfigurationMap是相机设备的“能力说明书”,告诉开发者硬件支持哪些输出配置。OutputConfiguration是实际构建输出流的“施工图”,将合法的参数绑定到具体的Surface`。 -
二者配合确保相机输出流的正确性和高效性
-
Q2: 如何避免
InvalidSurfaceException?
A: 确保OutputConfiguration的Surface参数(格式、分辨率)在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 生命周期
- 创建:通过
CameraDevice.createCaptureSession()或createCaptureSessionByOutputConfigurations()创建。 - 活动状态:可提交捕获请求,相机数据流向绑定的
Surface。 - 关闭:调用
close()释放资源,不可再发送请求。
3.创建 CameraCaptureSession
创建会话时,需要指定一组输出目标(Surface 或 OutputConfiguration)。两种方法:
-
传统方式(基于
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 是会话的输入
-
功能:
OutputConfiguration封装了一个或多个Surface的配置信息,用于定义输出流的特性:- 单个或共享的
Surface:通过addSurface()添加多个Surface,共享同一数据流(例如预览和录像共享同一帧数据)。 - 物理摄像头绑定:在双摄/多摄设备中,通过
setPhysicalCameraId()指定输出流来自哪个物理摄像头。 - 动态分辨率(API 23+):允许在会话运行时动态调整分辨率(需硬件支持)。
- 单个或共享的
-
优势:相比直接传递
Surface列表,OutputConfiguration提供了更细粒度的控制能力。
(2) 创建会话的流程
- 查询设备支持:通过
StreamConfigurationMap确认相机支持的格式和分辨率。 - 创建输出目标:根据合法参数创建
Surface(如ImageReader、SurfaceView)。 - 封装为 OutputConfiguration:将
Surface及其附加配置(如物理摄像头)封装到OutputConfiguration。 - 创建会话:调用
createCaptureSessionByOutputConfigurations(),传入OutputConfiguration列表。
(3) 关键约束
- 不可变性:一旦
CameraCaptureSession创建成功,其绑定的OutputConfiguration不可修改(如新增或移除Surface)。若需更改,必须关闭当前会话并重新创建。 - 硬件限制:
OutputConfiguration的配置(如分辨率、格式)必须符合StreamConfigurationMap的支持范围。
4. 示例:使用 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() {@Overridepublic void onConfigured(@NonNull CameraCaptureSession session) {// 会话就绪,可提交 CaptureRequest}@Overridepublic void onConfigureFailed(@NonNull CameraCaptureSession session) {// 配置失败(参数不合法或硬件问题)}}, null // 可选 Handler
);
5. 高级功能与兼容性
-
共享流(Shared Surfaces):
- 多个
Surface共享同一输出流(例如预览和 AI 分析共享数据),减少内存和功耗。 - 实现方式:通过
OutputConfiguration.addSurface()添加多个Surface。
- 多个
-
动态分辨率(Dynamic Resolution)(API 23+):
- 允许在会话运行时动态调整输出分辨率(需设备支持)。
- 通过
OutputConfiguration.setDynamicRangeProfile()配置。
-
多摄像头支持(API 28+):
- 在双摄设备中,通过
OutputConfiguration.setPhysicalCameraId()指定输出流来源。
- 在双摄设备中,通过
6. 常见问题与解决方案
-
问题1:
createCaptureSession失败,错误为IllegalArgumentException。
原因:OutputConfiguration参数不合法(如分辨率超出支持范围)。
解决:检查StreamConfigurationMap的合法参数。 -
问题2:无法在运行时修改输出流。
原因:CameraCaptureSession的配置不可变。
解决:关闭当前会话,重新创建新的会话。 -
问题3:多摄像头场景下数据流混乱。
原因:未正确指定setPhysicalCameraId()。
解决:确保每个OutputConfiguration绑定到正确的物理摄像头。
总结
CameraCaptureSession:是相机数据流的核心控制器,负责管理输出目标和捕获请求。- 与
OutputConfiguration的关系:OutputConfiguration是会话的输入,定义了每个输出流的具体配置(如Surface、物理摄像头)。CameraCaptureSession通过OutputConfiguration的配置,确保数据流符合硬件能力(由StreamConfigurationMap定义)。- 使用
OutputConfiguration可以启用高级功能(如共享流、多摄像头),而传统Surface列表方式功能受限。
通过合理使用 OutputConfiguration,开发者可以更灵活地配置相机输出流,满足复杂场景的需求(如多摄、动态分辨率、低功耗共享流)。
相关文章:
Android Camera API 介绍
一 StreamConfigurationMap 1. StreamConfigurationMap 的作用 StreamConfigurationMap 是 Android Camera2 API 中的一个核心类,用于描述相机设备支持的输出流配置,包含以下信息: 支持的格式与分辨率:例如 YUV_420_888、JPEG、…...
大数据项目2:基于hadoop的电影推荐和分析系统设计和实现
前言 大数据项目源码资料说明: 大数据项目资料来自我多年工作中的开发积累与沉淀。 我分享的每个项目都有完整代码、数据、文档、效果图、部署文档及讲解视频。 可用于毕设、课设、学习、工作或者二次开发等,极大提升效率! 1、项目目标 本…...
Windows逆向工程入门之汇编环境搭建
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 Visual Studio逆向工程配置 基础环境搭建 Visual Studio 官方下载地址安装配置选项(后期可随时通过VS调整) 使用C的桌面开发 拓展可选选项 MASM汇编框架 配置MASM汇编项目 创建新项目 选择空…...
gc buffer busy acquire导致的重大数据库性能故障
📢📢📢📣📣📣 作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯…...
前端学习-页面加载事件和页面滚动事件(三十二)
目录 前言 页面加载事件和页面滚动事件 页面加载事件 load事件 语法 注意 DOMContentLoaded事件 语法 总结 页面加载事件有哪两个?如何添加? load 事件 DOMContentLoaded事件 页面滚动事件 存在原因 scroll监听整个页面滚动 页面滚动事件-获取位置 scrollLef…...
C++:将函数参数定义为const T的意义
C++很多函数的参数都会定义为const T&,那么这么做的意义是什么呢? 避免拷贝:通过引用传递参数而不是值传递,可以避免对象的拷贝,从而提高性能,特别是当对象较大时。 保护数据:使用const关键字可以防止函数修改传入的参数,确保数据的安全性和一致性。 对于保护数据这…...
Formily 如何进行表单验证
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
安宝特方案 | AR眼镜:远程医疗的“时空折叠者”,如何为生命争夺每一分钟?
行业痛点:当“千里求医”遇上“资源鸿沟” 20世纪50年代,远程会诊的诞生曾让医疗界为之一振——患者不必跨越山河,专家无需舟车劳顿,一根电话线、一张传真纸便能架起问诊的桥梁。然而,传统远程医疗的局限也日益凸显&a…...
使用git commit时‘“node“‘ 不是内部或外部命令,也不是可运行的程序
第一种: 使用git commit -m "xxx"时会报错,我看网上的方法是在命令行后面添加--no-verify:git commit -m "主题更新" --no-verify,但是不可能每次都添加。 最后解决办法是:使用git config --lis…...
Python分享20个Excel自动化脚本
在数据处理和分析的过程中,Excel文件是我们日常工作中常见的格式。通过Python,我们可以实现对Excel文件的各种自动化操作,提高工作效率。 本文将分享20个实用的Excel自动化脚本,以帮助新手小白更轻松地掌握这些技能。 1. Excel单…...
nodejs - vue 视频切片上传,本地正常,线上环境导致磁盘爆满bug
nodejs 视频切片上传,本地正常,线上环境导致磁盘爆满bug 原因: 然后在每隔一分钟执行du -sh ls ,发现文件变得越来越大,即文件下的mp4文件越来越大 最后导致磁盘直接爆满 排查原因 1、尝试将m3u8文件夹下的所有视…...
瑞友天翼应用虚拟化系统 GetPwdPolicy SQL注入漏洞复现
免责声明 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在使…...
【MySQL — 数据库基础】深入解析MySQL的聚合查询
1. 聚合查询 1.1 聚合函数 函数说明COUNT ( [DISTINCT] expr)返回查询到的数据的数量( 行数 )SUM ( [DISTINCT] expr)返回查询到的数据的总和,不是数字没有意义AVG ( [DISTINCT] expr)返回查询到的数据的平均值,不是数字没有意义MAX( [DISTINCT] expr)…...
22.3、IIS安全分析与增强
目录 IIS安全威胁分析iis安全机制iis安全增强 IIS安全威胁分析 iis是微软公司的Web服务软件,主要提供网页服务,除此之外还可以提供其他服务,第一个最主要的是网页服务,第二个是SMTP邮件服务,第三个是FTP文件传输服务。…...
windows平台本地部署DeepSeek大模型+Open WebUI网页界面(可以离线使用)
环境准备: 确定部署方案请参考:DeepSeek-R1系列(1.5b/7b/8b/32b/70b/761b)大模型部署需要什么硬件条件-CSDN博客 根据本人电脑配置:windows11 + i9-13900HX+RTX4060+DDR5 5600 32G内存 确定部署方案:DeepSeek-R1:7b + Ollama + Open WebUI 1. 安装 Ollama Ollama 是一…...
港中文腾讯提出可穿戴3D资产生成方法BAG,可自动生成服装和配饰等3D资产如,并适应特定的人体模型。
今天给大家介绍一种名为BAG(Body-Aligned 3D Wearable Asset Generation)的新方法,可以自动生成可穿戴的3D资产,如服装和配饰,以适应特定的人体模型。BAG方法通过构建一个多视图图像扩散模型,生成与人体对齐…...
【人工智能】Python中的序列到序列(Seq2Seq)模型:实现机器翻译
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 序列到序列(Seq2Seq)模型是自然语言处理(NLP)中一项核心技术,广泛应用于机器翻译、语音识别、文本摘要等任务。本文深入探讨Seq2Seq模…...
34.日常算法
1.合并区间 题目来源 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入&#x…...
DeepSeek深度思考:客户端(Android/iOS)架构设计指南
目标读者:中高级开发者、架构师 适用场景:大型复杂应用开发、跨团队协作、长期维护迭代 一、架构设计核心原则 1.模块化(Modularization) 横向拆分:按功能边界划分(如登录、支付、消息模块)纵向…...
2025 年前端开发现状分析:卷疯了还是卷麻了?
一、前端现状:框架狂飙,开发者崩溃 如果你是个前端开发者,那么你大概率经历过这些场景: 早上打开 CSDN(或者掘金,随便),发现又有新框架发布了,名字可能是 VueXNext.js 之…...
数据库 绪论
目录 数据库基本概念 一.基本概念 1.信息 2.数据 3.数据库(DB) 4.数据库管理系统(DBMS) 5.数据库系统(DBS) 二.数据管理技术的发展 1.人工管理阶段 2.文件系统阶段 3.数据库系统阶段 4.数据库管…...
【AIGC魔童】DeepSeek v3提示词Prompt书写技巧
【AIGC魔童】DeepSeek v3提示词Prompt书写技巧 (1)基础通用公式(适用80%场景)(2)问题解决公式(决策支持)(3)创意生成公式(4)学习提升公…...
Docker 部署 RabbitMQ | 自带延时队列
一、获取镜像 docker pull farerboy/rabbitmq:3.9.9 二、运行镜像 docker run -d --name rabbitmq \n --hostname rabbitmq \n -p 15672:15672/tcp \n -p 5672:5672/tcp \n -v /wwwroot/opt/docker/rabbitmq:/var/lib/rabbitmq \n farerboy/rabbitmq:3.9.9 备注:…...
【Unity】Unity中物体的static属性作用
Unity中物体的static属性主要用于优化游戏性能和简化渲染过程。 Unity中物体的static属性的作用 优化渲染性能:当物体被标记为static时,Unity会在游戏运行时将其视为静止的物体,这意味着这些物体的渲染信息不会随着每一帧的更新而变化…...
网络编程基础1
七层协议模型和四层协议模型 七层协议模型:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 四层协议模型:链路层、网络层、传输层、应用层 TCP通信流程 服务器端 (1)创建socket(socket) (2)绑定自己的IP(bind) (3)监听客户端连接(liste…...
跨越边界,大模型如何助推科技与社会的完美结合?
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 概述 2024年,大模型技术已成为人工智能领域的焦点。这不仅仅是一项技术进步,更是一次可能深刻影响社会发展方方面面的变革。大模型的交叉能否推动技术与社会的真正融合?2025年…...
kafka生产端之架构及工作原理
文章目录 整体架构元数据更新 整体架构 消息在真正发往Kafka之前,有可能需要经历拦截器(Interceptor)、序列化器(Serializer)和分区器(Partitioner)等一系列的作用,那么在此之后又会…...
在 Windows 上使用 ZIP 包安装 MySQL 的详细步骤
以下是使用官方 ZIP 包在 Windows 上安装 MySQL 的详细步骤,确保能通过 mysql -uroot -p 成功连接。 步骤 1:下载 MySQL ZIP 包 访问 MySQL 官方下载页面: https://dev.mysql.com/downloads/mysql/选择 Windows (x86, 64-bit), ZIP Archive&…...
【web自动化】指定chromedriver以及chrome路径
selenium自动化,指定chromedriver,以及chrome路径 对应这篇文章,可以点击查看,详情 from selenium import webdriverdef get_driver():# 获取配置对象option webdriver.ChromeOptions()option.add_experimental_option("de…...
记录 | WPF创建和基本的页面布局
目录 前言一、创建新项目注意注意点1注意点2 解决方案名称和项目名称 二、布局2.1 Grid2.1.1 RowDefinitions 行分割2.1.2 Row & Column 行列定位区分 2.1.3 ColumnDefinitions 列分割 2.2 StackPanel2.2.1 Orientation 修改方向 三、模板水平布局【Grid中套StackPanel】中…...
