Administrator
发布于 2026-08-06 / 16 阅读
0
0

说一说Camera2 工作流程:打开设备、会话建立、CaptureRequest、CaptureResult;

Camera2 的核心设计思想是流水线(Pipeline)架构。它就像一个高度自动化的工厂:你提交一份生产订单(CaptureRequest),相机硬件(芯片和镜片)按照订单加工,最后输出产品(图片数据流)和生产报告(CaptureResult)。

下面我们把这个复杂的流水线拆解为四个核心阶段:


1. 打开设备 (Open Device)

这是流水线的准备阶段,目的是获取相机硬件的控制权。

  • 核心类:CameraManager、CameraDevice

  • 具体流程:

    1. 获取系统服务:通过 context.getSystemService(Context.CAMERA_SERVICE) 拿到 CameraManager。

    2. 筛选相机 ID:调用 manager.getCameraIdList(),通常 0 代表后置主摄,1 代表前置。

    3. 异步打开:调用 manager.openCamera(cameraId, stateCallback, handler)。

    4. 状态监听:在 CameraDevice.StateCallback 回调中,如果成功,会收到一个 CameraDevice 对象。这个对象就代表了当前的相机硬件。

  • 注意点:必须在 AndroidManifest.xml 中声明 CAMERA 权限,且在调用 openCamera 前进行动态权限检查。


2. 会话建立 (Create Capture Session)

相机打开后,还不能直接工作,必须建立一条通信管道,告诉相机你要把数据输出到哪里。

  • 核心类:CameraCaptureSession、Surface

  • 具体流程:

    1. 准备接收端(Surface):相机的数据需要有地方接收。比如,UI 预览界面(TextureView 或 SurfaceView 的 Surface)、负责录像的组件(MediaRecorder 的 Surface),或者负责处理数据的组件(ImageReader 的 Surface)。

    2. 配置会话:将所有需要用到的 Surface 包装成 OutputConfiguration,放到一个列表里。

    3. 创建会话:调用 cameraDevice.createCaptureSession(List<Surface>, stateCallback, handler)(在较新版本 Android 中推荐使用 SessionConfiguration)。

    4. 会话就绪:当底层硬件把这些输出通道全部打通后,会触发 CameraCaptureSession.StateCallback 中的 onConfigured(session)。此时,CameraCaptureSession 管道正式建立完毕。

  • 关键限制:一旦会话建立,输出目标(Surface)就固定了。如果中途想增加一个输出端(比如从“纯预览”切换到“边预览边录像”),必须销毁当前会话,重新建立新会话(切换时画面可能会有轻微闪烁)。


3. 下发请求 (CaptureRequest)

管道建好了,现在你可以向相机下发具体的“工作任务”了。CaptureRequest 就是那份生产订单,它包含了所有的控制参数。

  • 核心类:CaptureRequest、CaptureRequest.Builder

  • 具体流程:

    1. 创建模板:调用 cameraDevice.createCaptureRequest(TEMPLATE_PREVIEW)。系统提供了几种预设模板(如预览 TEMPLATE_PREVIEW、拍照 TEMPLATE_STILL_CAPTURE、录像 TEMPLATE_RECORD),帮你自动配置好基础参数。

    2. 定制参数:通过 builder.set(CaptureRequest.KEY, value) 精确控制硬件。例如:

      • builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)(开启持续自动对焦)

      • 手动调节 ISO、曝光时间、闪光灯等。

    3. 绑定目标:必须明确这份订单的数据送往哪个接收端,通过 builder.addTarget(surface) 绑定。

    4. 发送请求:

      • 持续重复请求(用于预览/录像):session.setRepeatingRequest(request, callback, handler)。相机会以 30 帧/秒的速度不断复制这份订单进行生产。

      • 单次请求(用于拍照):session.capture(request, callback, handler)。相机只执行一次该订单(通常是高画质捕捉)。


4. 结果返回 (CaptureResult)

当相机硬件按照 CaptureRequest 完成一帧的拍摄后,它会把产生的数据和元数据(Metadata)扔回给开发者。

  • 核心类:TotalCaptureResult (继承自 CaptureResult)、ImageReader / Surface

  • 具体流程:

    1. 图像数据走向:硬件生成的画面像素数据,直接流向了你在 CaptureRequest 中绑定的 Surface(例如直接显示在屏幕上,或者流进 ImageReader 触发 onImageAvailable 供你保存文件)。

    2. 状态数据走向:硬件拍摄这一帧时的具体物理状态,会通过 CameraCaptureSession.CaptureCallback 中的 onCaptureCompleted(session, request, result) 回调给你。

    3. 解析解析报告:通过 result.get(CaptureResult.KEY) 可以获取这一帧的真实物理参数。

      • 例如:你想知道刚才对焦成功了没有,可以获取 CaptureResult.CONTROL_AF_STATE。

      • 你想知道自动曝光算出的真实 ISO 是多少,可以获取 CaptureResult.SENSOR_SENSITIVITY。


总结:完整闭环拓扑图

这个闭环在预览时每秒运行 30 次以上,给予了开发者对每一帧画面的绝对控制权。



评论