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

Camera2 与 CameraX 闲谈

目录

📂 前言

1. 🔱 Camera2

2. 🔱 CameraX

3. 🔱 Camera2 与 CameraX

1)使用复杂度与开发效率

2)控制能力与应用场景

3)设备兼容性与稳定性

4)更新与维护

4. 💠 代码示例

1)Camera2 使用示例

2)CameraX 使用示例

5. ✅ 小结


        在 Android 开发领域,相机功能的实现一直是众多应用的核心竞争力之一。Camera2 和 CameraX 作为 Android 中两个重要的相机 API,它们在不同的场景下为开发者提供了强大的支持。本文将对比剖析这两个 API,从架构设计、使用场景、性能优化等多个维度进行探讨。

📂 前言

        Android 有三套关于摄像头的 API,分别是 Camera、Camera2 和 CameraX,其中 Camera 已废弃,在Android 5.0(API level 21)以后推荐使用 Camera2 和 CameraX。

        Camera2 引入是用来替换 Camera 的,它拥有丰富的 API 可以为复杂的用例提供深入的控制功能,但它使用起来也相对麻烦。

        CameraX 是在 Camera2 基础上构建的更高层次的库,旨在简化相机操作,提供更方便的 API,降低学习曲线。

1. 🔱 Camera2

        Camera2 对相机的底层控制要求很高,需要自定义功能、处理原始图像数据等。它遵循 Client-Server 架构,通过 Binder 通讯与 CameraService 和 Camera Hal 进行交互,这种架构使得 Camera2 能够实现对相机硬件的精细化操作,满足复杂自定义相机的需求。

        在实际开发中,使用 Camera2 需要处理较多的底层细节和设备兼容性问题。例如,配置一个简单的预览页面可能需要编写大量代码,包括创建容器、打开摄像头、搭建应用层与相机内核的桥梁、建立会话等步骤。这种复杂性在一定程度上增加了开发难度,但也为开发者提供了更广阔的操作空间。

        Camera2 的强大之处在于它允许开发者自定义相机参数,如 ISO、快门速度等。这对于需要精细控制相机硬件的复杂场景来说,无疑是至关重要的。例如,在专业摄影应用中,开发者可以通过 Camera2 实现对曝光、对焦等参数的精确控制,从而拍摄出高质量的照片。

        然而,Camera2 的使用也并非没有挑战。由于其底层操作的复杂性,开发者需要对相机硬件有深入的了解,并且需要处理不同设备的兼容性问题。这要求开发团队具备较高的技术水平和丰富的经验。

Androidhttps://developer.android.com/media/camera/camera2?hl=zh-cn

2. 🔱 CameraX

        CameraX 是 Android Jetpack 中的一个相机库,基于 Camera2 构建,为开发者提供了更高层次的抽象和简化的 API。它支持 Android 5.0 及以上版本,能够自动处理大量设备兼容性问题。CameraX 引入了 Use Case 组件,如预览(Preview)、图片拍摄(ImageCapture)、图像分析(ImageAnalysis)和视频拍摄(VideoCapture)等,开发者可以根据需要选择相应的 Use Case 进行配置,更轻松地实现基本的相机功能,大大简化了开发流程,降低开发难度。

  • 预览:使用 PreviewView,它是一种支持裁剪、缩放和旋转的 view,相机处于活动状态时,图片预览会流式传输到它的 surface。

  • 图片拍摄:提供自动白平衡、曝光、延迟、闪光灯和对焦等功能,支持把图片放到内存缓存区和写文件。

  • 图像分析:应用会对每个帧运行 analyze() 方法,可以进行图像处理、视觉或机器学习。

  • 视频拍摄:录制视频流和音频流,对其压缩合并后写入磁盘。

 

        CameraX 的核心特性之一是其生命周期感知能力。它与 Lifecycle 组件结合,开发者无需手动管理相机的生命周期。例如,在 Activity 或 Fragment 的后台切换时,CameraX 会自动停止或恢复预览,这种自动化的生命周期管理不仅减少了开发工作量,还提高了应用的稳定性和可靠性。

        此外,CameraX 在多版本兼容方面表现出色。它基于 Camera2 API 封装,兼容 Camera1,开发者无需为不同版本的 Android 系统编写额外的代码。这种兼容性使得 CameraX 能够广泛应用于各种设备,确保应用在不同设备上的良好运行。

        在实际应用中,CameraX 的使用非常便捷。例如,配置预览功能只需几十行代码即可完成。开发者可以快速搭建一个功能完善的相机应用,而无需深入理解底层的相机操作。这种高效性使得 CameraX 成为大多数开发者首选的相机开发工具。

CameraX 概览  |  Android media  |  Android Developerhttps://developer.android.google.cn/media/camera/camerax?hl=zh-cn

3. 🔱 Camera2 与 CameraX

特性

Camera2

CameraX

使用复杂度

控制能力

设备兼容性

生命周期管理

手动

自动

更新频率

学习曲线

陡峭

平缓

1)使用复杂度与开发效率

        Camera2 的使用复杂度较高,配置一个简单的预览页面需要编写大量代码,并且需要处理底层细节和设备兼容性问题。这种复杂性在一定程度上增加了开发周期和维护成本。相比之下,CameraX 对功能进行了详细划分,使用更加便捷,配置也更简单。例如,在 CameraX 中配置预览功能,只需几十行代码即可完成,大大提高了开发效率。

2)控制能力与应用场景

        Camera2 提供了更深入的相机控制能力,适合需要精细控制相机硬件的复杂场景。开发者可以自定义相机参数,如 ISO、快门速度等,这对于专业摄影应用来说至关重要。然而,这种精细化控制也要求开发者具备较高的技术水平和丰富的经验。CameraX 在方便开发的同时,对相机的精细化控制能力相对较弱。但它能够满足大多数常见的相机功能需求,如预览、拍照、视频录制等。

3)设备兼容性与稳定性

        CameraX 由专门团队维护,能够自动处理大量设备兼容性问题,减少了开发者在这方面的负担。它支持 Android 5.0 及以上版本,覆盖了广泛的设备范围。而使用 Camera2 时,开发者需要自己处理不同设备的兼容性问题,这增加了开发的难度和工作量。CameraX 的这种兼容性优势使得它在实际开发中更受欢迎,能够确保应用在各种设备上的稳定运行。

4)更新与维护

        CameraX 处于持续开发和更新中,平均一个月发布一个版本,开发者可以通过升级库来解决遇到的问题。这种持续更新的特性使得 CameraX 能够不断优化和改进,适应不断变化的开发需求。而 Camera2 作为系统级别的 API,更新相对较少,开发者在遇到边界问题时可能需要等待系统更新或自行解决。

4. 💠 代码示例

1)Camera2 使用示例

// 打开相机
cameraManager.openCamera(cameraId, object : CameraDevice.StateCallback() {
    override fun onOpened(camera: CameraDevice) {
        // 相机打开成功
    }

    override fun onDisconnected(camera: CameraDevice) {
        // 相机断开连接
    }

    override fun onError(camera: CameraDevice, error: Int) {
        // 相机出错
    }
}, null)

// 配置预览
val surface = Surface(textureView.surfaceTexture)
val captureRequest = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)
captureRequest.addTarget(surface)

// 创建会话
cameraDevice.createCaptureSession(listOf(surface), object : CameraCaptureSession.StateCallback() {
    override fun onConfigured(session: CameraCaptureSession) {
        // 会话配置完成
    }

    override fun onConfigureFailed(session: CameraCaptureSession) {
        // 会话配置失败
    }
}, null)

2)CameraX 使用示例

// 配置预览
val preview = Preview.Builder().build()
preview.setSurfaceProvider(textureView.surfaceProvider)

// 配置图像拍摄
val imageCapture = ImageCapture.Builder().build()

// 配置视频拍摄
val videoCapture = VideoCapture.Builder().build()

// 绑定Use Case
val cameraProviderFuture = ProcessCameraProvider.getInstance(context)
cameraProviderFuture.addListener({
    val cameraProvider = cameraProviderFuture.get()
    val camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture, videoCapture)
}, ContextCompat.getMainExecutor(context))

5. ✅ 小结

        Camera2 和 CameraX 在 Android 相机开发中各有千秋。Camera2 适合需要精细控制相机硬件的复杂场景,但使用复杂度较高,需要处理较多的底层细节和设备兼容性问题。CameraX 则提供了更简洁的 API 和自动处理设备兼容性的能力,适合大多数开发者快速开发相机应用。

        随着 Android 系统的不断演进和开发技术的不断提升,CameraX 凭借其高效性、兼容性和易用性,逐渐成为主流的相机开发工具。然而,Camera2 在特定的专业领域仍然具有不可替代的地位。开发者在选择使用哪个 API 时,应根据项目的具体需求和开发团队的技术能力进行权衡。

        未来,随着人工智能和机器学习技术的不断发展,CameraX 与这些技术的结合将为开发者提供更多可能性。例如,通过 CameraX 的图像分析功能,结合机器学习模型,可以实现更智能的图像处理和分析,如实时图像识别、文字识别、条形码识别等。这将为 Android 相机应用的开发带来新的机遇和挑战,推动相机功能的不断创新和发展。


 


http://www.kler.cn/a/596299.html

相关文章:

  • 【蓝桥杯—单片机】IAP15F2K61S2专项 | 真题整理、解析与拓展 | 省赛题(更新ing...)
  • 效率革命与用户体验的博弈——B端界面设计的底层逻辑与创新实践
  • 常用的pdf技术有哪些?--笔记
  • WebRTC建立Description的通信的实际的原理
  • Qt按钮控件常用的API
  • 自动化测试框架详解
  • https握手过程
  • Qt动态设置样式,实现样式实时切换
  • 项目实战:基于瑞萨RA6M5构建多节点OTA升级-创建工程MCUBoot<二>
  • 【CMake指南】第10篇:复杂项目重构与优化指南(实战)
  • CUDAOpenCV 基于Hessian矩阵计算特征值
  • Rust vs. Go: 在使用最快框架时的性能测试[译]
  • 界面控件DevExpress WPF v25.1预览 - .NET开发效率提升
  • java 数据库连接基于向驱动管理器注册第三方驱动的机制介绍,包含三种注册类型和华为高斯(GaussDB)数据库的完整连接例子
  • 【Node.js入门笔记9---path 模块】
  • PHP函数与数据处理
  • 深入理解 JavaScript/TypeScript 中的假值(Falsy Values)与逻辑判断 ✨
  • Oracle 常用语法汇总
  • pytest的测试报告allure
  • Vue3:构建高效用户界面的利器