返回

Camera1 框架:深入剖析 startPreview()

Android

Camera1 框架中 startPreview() 方法的深入剖析

在 Android 的 Camera1 框架中,startPreview() 方法是开启实时相机预览的核心。理解它的调用流程对于掌握 Camera1 的控制流和自定义相机开发至关重要。

控制流追踪

startPreview() 方法的调用路径如下图所示:

调用者 -> CameraService -> CameraModule -> 摄像头驱动程序

CameraService 是相机服务的接口,负责协调相机操作。CameraModule 充当 HAL(硬件抽象层)的接口,将命令传递给底层摄像头驱动程序。

CameraService.startPreview()

  1. startPreview() 方法接受相机 ID 和预览尺寸作为参数。
  2. 它查找并锁定相应的 CameraClient 对象,确保安全访问相机状态。
  3. 然后,它调用 CameraClient.startPreview()

CameraClient.startPreview()

  1. 该方法检查相机是否已打开。
  2. 它验证当前预览状态,确保尚未启动。
  3. 设置预览尺寸和格式后,它通知监听器预览已启用。
  4. 最后,它调用 CameraModule.startPreview()

CameraModule.startPreview()

  1. startPreview() 方法的具体实现因驱动程序而异。
  2. 它通常停止任何正在进行的预览,然后调用驱动程序的 startPreview() 方法启动摄像头。

分析

startPreview() 调用路径揭示了 Camera1 框架中组件之间的紧密协作:

  • CameraService 作为指挥中心,管理相机状态和操作。
  • CameraClient 作为状态持有者,协调预览相关任务。
  • CameraModule 充当 HAL 的网关,将命令传递给驱动程序。

结论

追踪 Camera1 框架中 startPreview() 方法的调用流程对于理解相机预览控制流至关重要。这些知识使开发人员能够深入了解框架并构建自定义相机解决方案。

常见问题解答

  1. 为什么 Camera1 框架不使用 startPreviewAsync() 方法?

    • startPreviewAsync() 方法在 Camera2 框架中可用,它允许异步启动预览,从而提高性能。Camera1 框架没有实现异步预览,因此需要使用 startPreview() 同步方法。
  2. 如何在 Camera1 中设置预览质量?

    • 预览质量可以通过调用 setPreviewFormat()setPreviewSize() 方法来设置。这些方法接受图像格式和尺寸参数,允许开发人员优化预览质量以满足其应用程序的需求。
  3. Camera1 中的预览帧如何处理?

    • 预览帧通过监听 Camera.PreviewCallback 接口中的 onPreviewFrame() 方法来接收。此方法允许开发人员访问原始预览帧数据进行处理和显示。
  4. Camera1 框架支持哪种预览格式?

    • Camera1 框架支持多种预览格式,包括 YUV420sp、YV12 和 NV21。开发人员应根据他们的特定应用程序要求选择适当的格式。
  5. 如何暂停 Camera1 中的预览?

    • 要暂停预览,开发人员可以调用 stopPreview() 方法。这将停止摄像头的预览流,释放资源并准备摄像头进行其他操作。