当前位置: 首页 > news >正文

Camera2 API架构基础:Android视频系统的大门

引言:Camera1已死,Camera2当立

你有没有在面试中被问过这样的问题:“为什么Android要废弃Camera1 API?Camera2到底改进了什么?”

如果你的回答只是"因为Camera1太旧了"——那这篇文章正是为你准备的。

Camera1(android.hardware.Camera)在2014年被正式废弃,取而代之的是Camera2android.hardware.camera2)。两者的差别不只是API名字换了几个字母,而是底层设计哲学的彻底重构。Camera1是命令式的——“拍照!”“录像!”;Camera2是声明式流式的——你描述你想要什么样的数据管道,系统帮你搭好,然后数据自动流淌。

用一个比喻:Camera1像是在餐厅点单(每次拍照都是单独下单),Camera2像是设置一条自动化流水线(配置好了,数据就按你期望的方式持续流出)。

本文是Android 15 视频子系统系列的第一篇,带你从架构层面彻底理解 Camera2 API 的设计理念和核心概念。

本文内容

  • Camera2 相比 Camera1 的本质改进
  • Camera2 五层架构全景解析
  • 五大核心组件:CameraManager / CameraDevice / CameraCaptureSession / CaptureRequest / CaptureResult
  • CameraCharacteristics 特性查询
  • Android 15 相机新特性(Ultra HDR、10-bit视频)
  • 调试工具速查

一、Camera1 的问题在哪里?

在深入 Camera2 之前,先理解为何需要改变。

1.1 Camera1 的三大痛点

痛点1:单流输出,无法同时预览+拍照+录像

Camera1 只支持一路输出流(预览到 SurfaceView),想同时录像和高分辨率预览?对不起,做不到。

痛点2:同步阻塞式 API,延迟不可控

// Camera1 的拍照 API - 同步阻塞,你无法精确控制时序camera.takePicture(shutterCallback,rawCallback,jpegCallback);// 从这一行到 jpegCallback 被调用,中间发生了什么?你不知道。

同步阻塞模型意味着你无法知道快门何时精确触发、曝光何时结束,导致连拍性能差、零快门延迟(ZSL)难以实现。

痛点3:3A 控制粗糙

Camera1 的自动对焦、自动曝光、自动白平衡(3A)无法精细控制,不支持手动 ISO、快门速度等专业参数。这对专业拍照 APP(如相机 APP、手动相机)来说是致命缺陷。

1.2 Camera2 的核心改进

维度Camera1Camera2
输出流数量1路多路并发(预览+拍照+录像同时输出)
控制模型同步命令式异步 Pipeline 流式
3A 控制粗粒度精细手动控制(ISO/快门/白平衡色温)
时间戳精度不可靠纳秒级时间戳,可精确同步
RAW 格式不支持支持 RAW10/RAW12/RAW16
多摄像头不支持支持逻辑相机(多摄融合)

二、Camera2 五层架构全景

Camera2 的技术栈由五层组成,从 Java API 到物理传感器,每层职责清晰:

2.1 应用层(Application Layer)

最顶层,开发者直接打交道的地方:

// 典型的 Camera2 开发入口CameraManagermanager=(CameraManager)getSystemService(Context.CAMERA_SERVICE);String[]cameraIds=manager.getCameraIdList();// 获取所有相机ID

Camera2 包路径:android.hardware.camera2.*

核心类一览:

  • CameraManager— 相机设备管理器(系统服务门口)
  • CameraDevice— 单个相机设备的抽象
  • CameraCaptureSession— 相机捕获会话
  • CaptureRequest— 单次或重复捕获请求
  • CaptureResult— 捕获结果元数据
  • CameraCharacteristics— 相机静态特性(只读,出厂就定了)

2.2 Java Framework 层

android.hardware.camera2.*这些 Java 类并非凭空运行,它们背后是 Java Framework 层:

frameworks/base/core/java/android/hardware/camera2/

关键类:

  • CameraManager.java— 通过 Binder 调用CameraService,管理相机设备列表
  • CameraDevice.java— Binder 代理,真正的实现在 Native 的Camera3Device
  • CameraCaptureSession.java— 会话管理,对应 Native 的CaptureSession

💡设计模式:Java 层的这些类本质上都是Binder 代理(Proxy),真正的逻辑在 Native 层的CameraService中执行。Java API 负责 “参数校验 + IPC 调用”,性能敏感的代码在 C++ 里跑。

2.3 Native 层(CameraService)

CameraService 是 Android 相机的核心 Native 服务,运行在独立进程cameraserver中:

frameworks/av/services/camera/libcameraservice/ # CameraService 实现 frameworks/av/camera/ # Camera Native 客户端库

核心组件:

组件职责
CameraService相机服务入口,多应用仲裁,权限管理
Camera3Device单个相机设备的完整抽象,管理 Stream 和 Request
CameraDeviceClientBinder 服务端,对接 Java 层的请求
CameraProviderManager管理所有 Camera HAL Provider

2.4 HAL 层(Camera HAL3)

HAL(Hardware Abstraction Layer)是 Android 框架与芯片厂商驱动之间的隔离层。Camera HAL3 使用 AIDL 接口定义(Android 13+,旧版为 HIDL):

hardware/interfaces/camera/ # HAL 接口定义

关键接口:

// hardware/interfaces/camera/provider/aidl/ICameraProvider.aidl interface ICameraProvider { // 获取相机设备列表 CameraIdAndStreamCombination[] getCameraIdList(); // 获取相机设备接口 ICameraDevice getCameraDeviceInterface(in String cameraDeviceName); } // hardware/interfaces/camera/device/aidl/ICameraDevice.aidl interface ICameraDevice { // 获取相机特性 CameraMetadata getCameraCharacteristics(); // 打开相机 ICameraDeviceSession open(in ICameraDeviceCallback callback); }

HAL3 与旧版 HAL1 的关键区别:从命令式改为 Request/Result 流水线模型——框架层发送 CaptureRequest,HAL 层流水线处理后返回 CaptureResult,完全异步。

2.5 驱动与硬件层

最底层与物理硬件交互:

  • V4L2(Video4Linux2):Linux 内核标准视频驱动接口
  • ISP(Image Signal Processor):图像信号处理器,负责 RAW → RGB 的图像处理
  • Camera Sensor:CMOS/CCD 传感器,实际光电转换
# 查看系统中的 V4L2 设备adb shellls/dev/video*# 通常输出类似:/dev/video0 /dev/video1

三、Camera2 五大核心概念

理解了整体架构,深入看五个核心类的设计意图和关系。

3.1 CameraManager:相机的管理总入口

CameraManager是系统服务,通过getSystemService()获取,作用是:

  1. 列举所有相机设备(前置、后置、外接 USB 相机)
  2. 查询相机静态特性(CameraCharacteristics
  3. 打开指定相机设备
  4. 监听相机可用性变化
CameraManagermanager=(CameraManager)context.getSystemService(Context.CAMERA_SERVICE);// 1. 获取相机列表String[]ids=manager.getCameraIdList();for(Stringid:ids){CameraCharacteristicschars=manager.getCameraCharacteristics(id);// 判断前/后置Integerfacing=chars.get(CameraCharacteristics.LENS_FACING);if(facing==CameraCharacteristics.LENS_FACING_BACK){Log.d(TAG,"后置摄像头 ID: "+id);}}// 2. 打开相机(异步,结果通过回调返回)manager.openCamera(backCameraId,newCameraDevice.StateCallback(){@OverridepublicvoidonOpened(@NonNullCameraDevicecamera){// 相机已打开,camera 就是 CameraDevice 对象mCameraDevice=camera;createCaptureSession();// 下一步:创建会话}@OverridepublicvoidonDisconnected(@NonNullCameraDevicecamera){camera.close();// 相机断开(被其他 App 抢占)}@OverridepublicvoidonError(@NonNullCameraDevicecamera,interror){// 错误处理,error 值参见 CameraDevice.StateCallback.ERROR_*camera.close();}},backgroundHandler);

⚠️注意openCamera()需要android.permission.CAMERA运行时权限。Android 12+ 还需要处理隐私

http://www.jsqmd.com/news/578050/

相关文章:

  • SQL Server 兼容性设置导致 EF Core Contains 查询失败?手把手教你修复
  • OpenOCD实战指南:调试适配器配置详解
  • 从混淆矩阵到工业实践:深度解析故障检测核心指标的计算与权衡
  • 5G NR帧结构与信道:从基础原理到实际应用
  • 基于PLC的花卉生长控制系统设计与仿真
  • 泛微Ecology数据库小白必看:三张表搞定待办、已办、办结查询(附完整SQL及字段解释)
  • 避坑指南:Win10 LTSC 2021安装kb5017308补丁后可能遇到的新问题及解决方法
  • RocksDB Java API避坑指南:事务、列族与迭代器,这些细节你注意了吗?
  • Numpy 第五章 数学函数
  • R语言孟德尔随机化环境搭建:手把手教你搞定gwasvcf、gwasglue等包的安装报错
  • 从踩坑到跑通:一个SOEM控制伺服电机的完整C语言实战记录(附23位编码器配置)
  • MOEA/D算法实战:从多目标背包问题到性能优化全解析
  • 高性能VC散热技术:突破笔电与数据产品的散热瓶颈
  • WSL2-Ubuntu18.04进阶指南:通过VNC与XFCE4打造高效远程开发环境
  • 使用 OpenTelemetry 和 Elastic 的 ML 和 AI Ops 可观测性
  • 2026无锡比较好的代办营业执照公司推荐有哪些?代办公司/资质代办/代办营业执照/注册公司,代办营业执照公司选哪家 - 品牌推荐师
  • ABB机器人X6-WAN口多协议共存实战:NFS、Socket、RobotStudio与Profinet如何和谐共处?
  • Product Hunt 每日热榜 | 2026-04-02
  • 从防撞自行车到智能草莓采摘机:聊聊OAK(OpenCV AI Kit)创始人的脑洞与开源生态
  • 电流监测是设备健康诊断的常用手段。上周帮同事调试电机时,发现异常振动——这时候频谱分析就能派上用场了。先来段基础电流分析的代码
  • 在x86环境构建龙芯兼容的Debian系统(mips64el):从交叉编译到系统优化
  • 物联网智能小车实战:L9110S、TB6612FNG与DRV8833电机驱动模块深度对比与应用指南
  • 用两片74LS73芯片,手把手教你搭建一个四位二进制计数器(附完整电路图与波形分析)
  • 1079div1A. Game with a Fraction
  • 从YOLOv5到YOLOv11:聊聊为什么Ultralytics还在用CNN,以及我踩过的那些坑
  • 艾奇GEO:零售企业AI搜索转化低破局指南——从流量到意图的精准匹配逻辑 - 小白条111
  • 入行热设计近20年,我整理了一份新手入门指南(价值/流程/资料/避坑)
  • ICMP协议实战指南:从原理到网络诊断
  • 别再只会ollama run了!这10个Ollama命令帮你玩转本地大模型
  • Go高性能缓冲区管理器(BufferManager)设计与实现