camera hal preview流程

本文详细解析了OpenCV相机预览流程,包括初始化、设置默认流、配置流、数据下发与回传等关键步骤,以及preview启动的详细步骤和数据流转路径。通过理解这些核心环节,掌握摄像头操作的基础原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接着上一篇camera open流程,open camera后就是预览流程
可以通过log看到
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到open之后相应的调用流程应该是
initiallze–>construct_default_request_settings -->configure_streams–>processCaptureRequest–>handleCbDataWithLock

  1. construct_default_request_settings 设置默认的流数据,并不是所有的流数据都是上层下发的, 有一部分是默认的。
  2. configure_streams
    在这里插入图片描述

上面这张图明确描述了函数调用流程,为之后的start和request做准备

  1. processCaptureRequest数据下发和handleCbDataWithLock数据回传,后面会详细介绍

camera preview 重点是preview启动,数据的下发和回传

1. preview 启动

在这里插入图片描述
在这里插入图片描述

执行顺序
channel->request(stream, output.buffer, frameNumber)分配prev buffer
mRegularChan->start(mFrameNum) ->
SprdCamera3OEMIf::start()->
startPreviewInternal()

数据下发流程如上图channel->request
在这里插入图片描述

preview启动流程mRegularChan->start(mFrameNum)
在这里插入图片描述

数据回传

在这里插入图片描述
总的流程如下图
在这里插入图片描述

类似的可以查看拍照流程
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

### Camera HAL3 基本工作流程 #### 初始化阶段 当应用程序请求访问相机资源时,Camera HAL3 需要初始化并准备就绪。这涉及到加载必要的模块和服务启动过程[^1]。 ```cpp // 示例:初始化HAL服务 int camera_hal_init() { // 加载HAL库 hw_module_t* module; int ret = hw_get_module(CAMERA_HARDWARE_MODULE_ID, (const hw_module_t**)&module); if(ret != 0){ LOGE("Failed to load camera hal"); return -1; } } ``` #### 打开设备 一旦初始化完成,下一步就是打开具体的相机设备实例。此操作会创建一个与特定物理摄像头对应的句柄,并返回给调用者用于后续的操作命令传递[^2]。 ```cpp camera_device_t *device; status_t status = mModule->methods->open(mModule, &mCallbacks, &device); if(status != OK){ ALOGE("%s: Failed to open device", __FUNCTION__); } ``` #### 构建配置结构体 为了向硬件发送指令,在每次拍摄前都需要构建相应的`CaptureRequest`对象。这些请求包含了诸如曝光时间、增益设置等参数,它们定义了此次成像的具体条件[^4]。 ```json { "template": "preview", "controlMode": "auto", "aeMode": "on" } ``` #### 提交请求队列 将上述构造好的请求加入到待处理的任务列表中去执行。通常情况下,多个连续帧的数据采集可以通过批量提交的方式来提高效率和性能表现。 ```java List<CaptureRequest> requests = new ArrayList<>(); for(int i=0;i<batchSize;i++){ CaptureRequest request = createCaptureRequest(); requests.add(request); } cameraDevice.createCaptureSession(surfaces, sessionCallback).setRepeatingRequests(requests); ``` #### 处理回调事件 随着图像数据流的到来以及状态变化的发生,系统会触发一系列预定的回调函数供开发者监听响应。比如每当有新的JPEG图片生成完毕之后就可以通知UI界面更新显示内容。 ```java private final CameraCaptureSession.CaptureCallback captureListener = new CameraCaptureSession.CaptureCallback(){ @Override public void onCaptureCompleted( CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) { super.onCaptureCompleted(session,request,result); process(result); } }; ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

autho

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值