Camera2API笔记

发布于:2025-07-11 ⋅ 阅读:(88) ⋅ 点赞:(0)

1. 常用对象

  1. CameraManager 相机服务。用于获取相机对象和相机信息。
  2. CameraDevices 相机设备。负责连接相机、创建会话、生成拍摄请求,管理相机生命周期。
  3. CameraCaptureSession 相机拍摄会话。用于预览和拍摄。一个相机只能有一个活跃会话。打开新会话时,旧会话自动关闭。
  4. SessionConfiguration 拍摄会话配置。
  5. CaptureRequest 拍摄请求。通知相机进行拍摄。每个请求产生一个CaptureResult对象,并为目标Surface产生帧。请求可以通过addTarget关联若干个Surface,但它们必须是创建拍摄会话时使用的Surface的子集。
  6. CameraCharacteristics 相机信息。
  7. CaptureResult 部分拍摄结果信息。
  8. TotalCaptureResult 完整拍摄结果信息。
  9. ImageReader 图片读取器。接收图片的对象。
  10. Surface 底片。接收或展示原始影像的对象,是数据管道终点。可以绑定到SurfaceView(预览)、ImageReader(获取图像)或MediaRecorder(录制视频)。

2. 监听器

  1. CameraDevice.StateCallback 相机状态监听器。
  2. CameraCaptureSession.StateCallback 相机拍摄会话状态监听器。
  3. CameraCaptureSession.CaptureCallback 拍摄结果监听器。CaptureCallback只通知结果,图片需要从ImageReader.OnImageAvailableListener中获取。CaptureCallback和OnImageAvailableListener不保证发生顺序。
  4. ImageReader.OnImageAvailableListener 图片监听器。
  5. SurfaceTexture.OnFrameAvailableListener 帧就绪监听器。
  6. MediaRecorder.OnInfoListener​ 录制状态监听器。
  7. MediaRecorder.OnErrorListener 录制错误监听器。

3. 使用Camera2 API时涉及的线程/进程

  1. 相机服务进程 cameraserver系统进程(用户态服务),负责管理相机硬件资源、处理底层传感器控制和图像处理流水线。包括打开/关闭相机设备、配置会话、处理捕获请求和返回元数据,通过Binder与应用进程通信。
  2. 图像渲染线程 处理预览画面和拍照结果的渲染,通常与显示界面(如 SurfaceView/TextureView)绑定。
    1. SurfaceView 由系统单独创建渲染线程(非主线程),通过双缓冲机制高效更新预览画面。
    2. TextureView 依赖主线程或 OpenGL 线程渲染,需开启硬件加速,但更灵活(支持缩放、旋转)。
    3. 数据接收 通过ImageReader的OnImageAvailableListener在子线程中异步接收图像数据。
  3. 应用主线程 管理UI交互、权限请求、生命周期回调,并协调其他线程的工作。所有Camera2耗时操作(如打开相机、创建会话)需在后台线程执行,避免阻塞UI。通常使用HandlerThread配合Handler处理回调。通过Handler将相机事件(如 onCaptureCompleted)从后台线程转发到主线程更新UI。

4. CaptureRequest分类

  1. 重复请求。通过setRepeatingRequest()提交的请求会持续执行,形成一个持续请求链,直到被手动停止(stopRepeating())或被新请求覆盖。主要用于预览等需连续输出图像流的场景,例如实时显示摄像头画面。重复请求不阻塞后续请求,系统自动按帧率持续处理。但优先级较低,可被单次请求(如拍照)中断。中断后需要手动恢复预览。
  2. 单次请求。通过capture()或captureBurst()提交,执行后自动清除。适用于拍照、手动对焦锁定等需即时触发的操作。单次请求优先级高,会中断重复请求运行。请求提交后立即返回,拍摄结果通过回调异步返回。

在CameraCaptureSession中,可以连续且不等待拍摄完成就发送新CaptureRequest。但要注意避免请求过多超出流水线容量,导致帧丢弃或延迟。可以通过CaptureCallback监听状态,控制请求频率。通过CameraCharacteristics的REQUEST_PIPELINE_MAX_DEPTH可以得到流水线容量。

5. 拍摄一张照片需要确认下列资源或状态就绪

  1. 资源就绪。
    1. 获得授权。
    2. 相机CameraDevice就绪。
    3. 相机拍摄会话CameraCaptureSession就绪。
    4. 图像阅读器ImageReader就绪(提供Surface)。
  2. 3A状态就绪。
    1. 自动曝光AE收敛(AE_STATE_CONVERGED)或锁定(AE_STATE_LOCKED)。否则可能过曝/欠曝。
    2. 自动对焦AF锁定(AF_STATE_FOCUSED_LOCKED)。连续对焦模式下可以容忍ACTIVE_SCAN状态。否则可能主体模糊或焦点偏移。
    3. 自动白平衡AWB收敛(AWB_STATE_CONVERGED)。否则可能产生色偏。
  3. 其他状态
    1. 闪光灯充电完成(FLASH_STATE_READY)。否则可能导致闪光失败或亮度不足。
    2. 光学防抖OIS镜片稳定(LENS_STATE_STATIONARY)。否则可能防抖不生效。
    3. 降噪模式(NOISE_REDUCTION_MODE_HIGH_QUALITY)。否则可能降噪算法不生效。
    4. 传感器稳定性(SENSOR_SENSITIVITY)。

6. 中断3A算法的操作

  1. 切换控制模式CONTROL_MODE。
  2. 切换场景模式SCENE_MODE。
  3. 触发3A操作。
  4. 锁定或解锁3A参数。
  5. 停止预览流stopRepeating()。
  6. 请求中包含与当前3A参数冲突的3A参数。
  7. 重启相机或会话。
  8. 光线剧烈变化。

7. 拍摄请求处理路径

CameraCaptureSessionImpl.capture
  CameraDeviceImpl.capture
    CameraDeviceImpl.submitCaptureRequest
      检查Target和Surface
        throw "Each request must have at least one Surface target"
        throw "Null Surface targets are not allowed"
      stopRepeating() // 中断重复请求。
      ICameraDeviceUserWrapper.submitRequestList()
        ICameraDeviceUser.submitRequestList()
          // 通过ICameraDeviceUser.aidl调用C++代码。
          CameraDeviceClient::submitRequestList
            Camera3Device::captureList
              Camera3Device::submitRequestsHelper
                if (repeating) 
                  Camera3Device::RequestThread::setRepeatingRequests
                    List<sp<CaptureRequest>> mRepeatingRequests.push_back
                    // 后续由Camera3Device::RequestThread异步处理。
                else
                  Camera3Device::RequestThread::queueRequestList
                    List<sp<CaptureRequest>> mRequestQueue.push_back
                    // 后续由Camera3Device::RequestThread异步处理。

8. 后台线程主循环

Camera3Device::RequestThread::threadLoop() {
    waitForNextRequestBatch();
    prepareHalRequests();
    sendRequestsBatch();
      Camera3Device::HalInterface::processBatchCaptureRequests
        CameraDeviceSession::processCaptureRequest
          CameraDeviceSession::processOneCaptureRequest
            camera3_device_t->ops->process_capture_request
              camera3_device_ops.process_capture_request
                // 通用实现。
                Camera::processCaptureRequest
                  Camera::processCaptureBuffer
}

9. 使用DngCreator保存RAW_SENSOR影像的条件

  1. 拍摄完成,已经得到TotalCaptureResult结果。
  2. ImageReader.OnImageAvailableListener已经收到图片。

10. CaptureCallback用于跟踪拍摄请求处理进度

  1. onCaptureStarted 相机开始拍摄(曝光)
  2. onReadoutStarted 相机开始读取传感器数据
  3. onCapturePartial 拍摄获得部分结果
  4. onCaptureProgressed 拍摄获得进展
  5. onCaptureCompleted 单次拍摄完成
  6. onCaptureFailed 拍摄失败
  7. onCaptureSequenceCompleted 拍摄序列全部完成
  8. onCaptureSequenceAborted 拍摄序列中断
  9. onCaptureBufferLost

网站公告

今日签到

点亮在社区的每一天
去签到