Camera2API笔记
1. 常用对象
- CameraManager 相机服务。用于获取相机对象和相机信息。
- CameraDevices 相机设备。负责连接相机、创建会话、生成拍摄请求,管理相机生命周期。
- CameraCaptureSession 相机拍摄会话。用于预览和拍摄。一个相机只能有一个活跃会话。打开新会话时,旧会话自动关闭。
- SessionConfiguration 拍摄会话配置。
- CaptureRequest 拍摄请求。通知相机进行拍摄。每个请求产生一个CaptureResult对象,并为目标Surface产生帧。请求可以通过addTarget关联若干个Surface,但它们必须是创建拍摄会话时使用的Surface的子集。
- CameraCharacteristics 相机信息。
- CaptureResult 部分拍摄结果信息。
- TotalCaptureResult 完整拍摄结果信息。
- ImageReader 图片读取器。接收图片的对象。
- Surface 底片。接收或展示原始影像的对象,是数据管道终点。可以绑定到SurfaceView(预览)、ImageReader(获取图像)或MediaRecorder(录制视频)。
2. 监听器
- CameraDevice.StateCallback 相机状态监听器。
- CameraCaptureSession.StateCallback 相机拍摄会话状态监听器。
- CameraCaptureSession.CaptureCallback 拍摄结果监听器。CaptureCallback只通知结果,图片需要从ImageReader.OnImageAvailableListener中获取。CaptureCallback和OnImageAvailableListener不保证发生顺序。
- ImageReader.OnImageAvailableListener 图片监听器。
- SurfaceTexture.OnFrameAvailableListener 帧就绪监听器。
- MediaRecorder.OnInfoListener 录制状态监听器。
- MediaRecorder.OnErrorListener 录制错误监听器。
3. 使用Camera2 API时涉及的线程/进程
- 相机服务进程 cameraserver系统进程(用户态服务),负责管理相机硬件资源、处理底层传感器控制和图像处理流水线。包括打开/关闭相机设备、配置会话、处理捕获请求和返回元数据,通过Binder与应用进程通信。
- 图像渲染线程 处理预览画面和拍照结果的渲染,通常与显示界面(如 SurfaceView/TextureView)绑定。
- SurfaceView 由系统单独创建渲染线程(非主线程),通过双缓冲机制高效更新预览画面。
- TextureView 依赖主线程或 OpenGL 线程渲染,需开启硬件加速,但更灵活(支持缩放、旋转)。
- 数据接收 通过ImageReader的OnImageAvailableListener在子线程中异步接收图像数据。
- 应用主线程 管理UI交互、权限请求、生命周期回调,并协调其他线程的工作。所有Camera2耗时操作(如打开相机、创建会话)需在后台线程执行,避免阻塞UI。通常使用HandlerThread配合Handler处理回调。通过Handler将相机事件(如 onCaptureCompleted)从后台线程转发到主线程更新UI。
4. CaptureRequest分类
- 重复请求。通过setRepeatingRequest()提交的请求会持续执行,形成一个持续请求链,直到被手动停止(stopRepeating())或被新请求覆盖。主要用于预览等需连续输出图像流的场景,例如实时显示摄像头画面。重复请求不阻塞后续请求,系统自动按帧率持续处理。但优先级较低,可被单次请求(如拍照)中断。中断后需要手动恢复预览。
- 单次请求。通过capture()或captureBurst()提交,执行后自动清除。适用于拍照、手动对焦锁定等需即时触发的操作。单次请求优先级高,会中断重复请求运行。请求提交后立即返回,拍摄结果通过回调异步返回。
在CameraCaptureSession中,可以连续且不等待拍摄完成就发送新CaptureRequest。但要注意避免请求过多超出流水线容量,导致帧丢弃或延迟。可以通过CaptureCallback监听状态,控制请求频率。通过CameraCharacteristics的REQUEST_PIPELINE_MAX_DEPTH可以得到流水线容量。
5. 拍摄一张照片需要确认下列资源或状态就绪
- 资源就绪。
- 获得授权。
- 相机CameraDevice就绪。
- 相机拍摄会话CameraCaptureSession就绪。
- 图像阅读器ImageReader就绪(提供Surface)。
- 3A状态就绪。
- 自动曝光AE收敛(AE_STATE_CONVERGED)或锁定(AE_STATE_LOCKED)。否则可能过曝/欠曝。
- 自动对焦AF锁定(AF_STATE_FOCUSED_LOCKED)。连续对焦模式下可以容忍ACTIVE_SCAN状态。否则可能主体模糊或焦点偏移。
- 自动白平衡AWB收敛(AWB_STATE_CONVERGED)。否则可能产生色偏。
- 其他状态
- 闪光灯充电完成(FLASH_STATE_READY)。否则可能导致闪光失败或亮度不足。
- 光学防抖OIS镜片稳定(LENS_STATE_STATIONARY)。否则可能防抖不生效。
- 降噪模式(NOISE_REDUCTION_MODE_HIGH_QUALITY)。否则可能降噪算法不生效。
- 传感器稳定性(SENSOR_SENSITIVITY)。
6. 中断3A算法的操作
- 切换控制模式CONTROL_MODE。
- 切换场景模式SCENE_MODE。
- 触发3A操作。
- 锁定或解锁3A参数。
- 停止预览流stopRepeating()。
- 请求中包含与当前3A参数冲突的3A参数。
- 重启相机或会话。
- 光线剧烈变化。
7. 拍摄请求处理路径
CameraCaptureSessionImpl.captureCameraDeviceImpl.captureCameraDeviceImpl.submitCaptureRequest检查Target和Surfacethrow "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::submitRequestListCamera3Device::captureListCamera3Device::submitRequestsHelperif (repeating) Camera3Device::RequestThread::setRepeatingRequestsList<sp<CaptureRequest>> mRepeatingRequests.push_back// 后续由Camera3Device::RequestThread异步处理。elseCamera3Device::RequestThread::queueRequestListList<sp<CaptureRequest>> mRequestQueue.push_back// 后续由Camera3Device::RequestThread异步处理。
8. 后台线程主循环
Camera3Device::RequestThread::threadLoop() {waitForNextRequestBatch();prepareHalRequests();sendRequestsBatch();Camera3Device::HalInterface::processBatchCaptureRequestsCameraDeviceSession::processCaptureRequestCameraDeviceSession::processOneCaptureRequestcamera3_device_t->ops->process_capture_requestcamera3_device_ops.process_capture_request// 通用实现。Camera::processCaptureRequestCamera::processCaptureBuffer
}
9. 使用DngCreator保存RAW_SENSOR影像的条件
- 拍摄完成,已经得到TotalCaptureResult结果。
- ImageReader.OnImageAvailableListener已经收到图片。
10. CaptureCallback用于跟踪拍摄请求处理进度
- onCaptureStarted 相机开始拍摄(曝光)
- onReadoutStarted 相机开始读取传感器数据
- onCapturePartial 拍摄获得部分结果
- onCaptureProgressed 拍摄获得进展
- onCaptureCompleted 单次拍摄完成
- onCaptureFailed 拍摄失败
- onCaptureSequenceCompleted 拍摄序列全部完成
- onCaptureSequenceAborted 拍摄序列中断
- onCaptureBufferLost