Android Camera 框架全景解析3

四、关键流程实现剖析

4.1 预览功能

  • SurfaceView/TextureView与Camera2的绑定
  • 数据流路径:HAL→CameraService→App Surface
    数据流流程

4.1.1 SurfaceView/TextureView与Camera2的绑定流程

  1. 视图初始化与权限申请

    • 在布局文件中定义TextureViewSurfaceView,例如通过<TextureView>标签声明预览控件。
    • 动态申请相机权限(android.permission.CAMERA),并在AndroidManifest.xml中声明硬件特性(如android.hardware.camera)。
  2. Surface创建与配置

    • TextureView:通过SurfaceTextureListener监听Surface可用性,在onSurfaceTextureAvailable回调中获取SurfaceTexture对象,并创建Surface实例。
    • SurfaceView:通过SurfaceHolder获取Surface对象,并设置SurfaceHolder.Callback监听生命周期。
    • 示例代码片段:
      SurfaceTexture texture = textureView.getSurfaceTexture();
      texture.setDefaultBufferSize(previewWidth, previewHeight);
      Surface surface = new Surface(texture); // 绑定到Camera2的预览输出
      
  3. Camera2 API交互

    • 通过CameraManager获取相机设备列表,选择指定摄像头(如后置摄像头)并调用openCamera打开设备。
    • 创建CameraCaptureSession时,将Surface对象添加到会话的输出目标列表中,完成视图与相机的绑定。
    • 示例关键步骤:
      cameraDevice.createCaptureSession(Arrays.asList(surface), sessionCallback, null);
      

4.1.2 数据流路径:HAL → CameraService → App Surface

  1. HAL层(硬件抽象层)

    • 相机硬件通过V4L2框架与内核驱动交互,HAL层(如CamX-CHI)负责将原始图像数据转换为Android标准格式(如YUV或RAW)。
    • HAL通过CameraProvider进程暴露接口,接收来自CameraService的配置请求(如分辨率、帧率)。
  2. CameraService层

    • CameraService作为系统服务,通过Binder机制接收应用的CaptureRequest,并将其转发至HAL层。
    • 管理相机设备的生命周期,协调多个应用的访问权限,确保数据流的独占性或共享性。
  3. 应用层数据传递

    • 图像数据从HAL层经CameraProvider传递到CameraService,再通过CameraCaptureSession的管道机制传输到应用层的Surface
    • 最终,数据通过SurfaceFlinger渲染到屏幕,或通过ImageReader回调供应用处理(如人脸识别)。

4.1.3 关键流程示意图

Camera Hardware → HAL (CamX-CHI) → CameraProvider → CameraService → CameraCaptureSession → App Surface (TextureView/SurfaceView)

4.2 拍照流程

  • 单帧捕获(ImageCapture)与连拍优化
  • 视频编码器(MediaCodec)与Camera2的协同
    在这里插入图片描述

4.2.1 单帧捕获(ImageCapture)流程

4.2.1.1 初始化相机设备
  • 获取CameraManager:通过系统服务获取相机管理器实例,用于枚举和打开摄像头。
  • 选择摄像头ID:遍历getCameraIdList()获取可用摄像头列表,并通过CameraCharacteristics筛选前置/后置摄像头。
  • 打开摄像头:调用openCamera()并注册CameraDevice.StateCallback监听设备状态。
4.2.1.2 创建捕获会话
  • 配置输出Surface:包括预览的SurfaceView/TextureView和拍照的ImageReader的Surface。
  • 创建CaptureSession:通过createCaptureSession()建立会话,并在CameraCaptureSession.StateCallback中处理会话就绪事件。
4.2.1.3 构建捕获请求
  • 选择模板类型:使用TEMPLATE_STILL_CAPTURE创建静态图像请求模板。
  • 设置参数:通过CaptureRequest.Builder配置自动对焦、曝光模式、JPEG质量等参数。
  • 触发捕获:调用capture()方法发送请求,并在CaptureCallback中接收结果。
4.2.1.4 图像处理与保存
  • 获取Image数据:通过ImageReader.OnImageAvailableListener异步获取YUV或JPEG格式数据。
  • 格式转换与压缩:使用YuvImageBitmapFactory处理原始数据,并通过异步线程保存至文件。

4.2.2 连拍优化策略

4.2.2.1 减少处理延迟
  • 缓冲区复用:通过ImageReader预分配多个缓冲区,避免频繁内存分配。
  • 异步处理链:将图像处理(如降噪、压缩)放入后台线程,防止阻塞主线程。
4.2.2.2 会话与请求优化
  • 批量请求提交:使用captureBurst()一次性提交多个请求,减少IPC通信开销[。
  • 动态参数调整:在连拍过程中动态调整曝光补偿或ISO值,避免逐帧配置。
4.2.2.3 内存与存储优化
  • 内存池管理:限制连拍缓存数量(如5-10帧),防止OOM异常。
  • 存储异步写入:通过AsyncTask
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值