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

Camera2API笔记

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.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影像的条件

  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
http://www.dtcms.com/a/272183.html

相关文章:

  • Unity WebGL文本输入
  • centos7 安装jenkins
  • jenkins部署springboot项目
  • 抽象类与接口:Java面向对象设计的两大支柱
  • 表达式索引海外云持久化实践:关键技术解析与性能优化
  • Spring Boot 整合 RabbitMQ
  • 【前端】接口日志追踪
  • 06.消息传递网络
  • 「日拱一码」023 机器学习——超参数优化
  • 判断当前是否为钉钉环境
  • 【Pandas】pandas DataFrame from_dict
  • 1.2.3_1 OSI参考模型
  • STM32F103C8T6单片机内部执行原理及启动流程详解
  • vue3实现pdf文件预览 - vue-pdf-embed
  • 力扣热门算法题 127.单词接龙,128.最长连续序列,130.被围绕的区域
  • MySQL数据库基础教程:从安装到数据操作
  • 快速合并多个CAD图形为单一PDF文档的方法
  • 常见 Docker 错误及解决方法
  • (vue)前端区分接口返回两种格式,一种Blob二进制字节流,一种常规JSON,且将blob响应转为json
  • 基于Catboost算法的茶叶数据分析及价格预测系统的设计与实现
  • 多元函数的切平面与线性近似:几何直观与计算方法
  • 高数附录(1)—常用平面图形
  • 《O-PAS™标准的安全方法》白皮书:为工业自动化系统筑起安全防线
  • msf复现永恒之蓝
  • 每日一SQL 【各赛事的用户注册率】
  • Datawhale AI 夏令营:基于带货视频评论的用户洞察挑战赛 Notebook(下篇)
  • 流媒体服务
  • SIMATIC S7-1200的以太网通信能力:协议与资源详细解析
  • x86架构CPU市场格局
  • WIFI协议全解析05:WiFi的安全机制:IoT设备如何实现安全连接?