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.pswp.cn/bicheng/74444.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74444.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74444.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【大語言模型_8】vllm啟動的模型通過fastapi封裝增加api-key驗證

背景: vllm推理框架啟動模型不具備api-key驗證。需借助fastapi可以實現該功能 代碼實現: rom fastapi import FastAPI, Header, HTTPException, Request,Response import httpx import logging# 創建 FastAPI 應用 app FastAPI() logging.basicConfig(…

基于SpringBoot的名著閱讀網站

作者:計算機學姐 開發技術:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源碼”。 專欄推薦:前后端分離項目源碼、SpringBoot項目源碼、Vue項目源碼、SSM項目源碼、微信小程序源碼 精品專欄:…

Langchain 自定義工具和內置工具

使用介紹 自定義工具時的元素概念介紹 在Langchain中,工具(Tool)是與語言模型交互的基本單元。以下是自定義工具時的關鍵元素: name 定義:工具的名稱,用于唯一標識該工具。作用:當工具被集成…

Gitee上庫常用git命令

Gitee上庫常用git命令 1、Fork 項目2、個人倉庫修改3、追加提交4、創建PR5、多筆commit合一 1、Fork 項目 2、個人倉庫修改 git add . // -s 表示自動添加郵箱簽名信息,-m表示其后跟隨commit描述 git commit -sm “add transition freeze” git push origin [目標…

Java 大視界 -- Java 大數據在智慧農業精準灌溉與施肥決策中的應用(144)

💖親愛的朋友們,熱烈歡迎來到 青云交的博客!能與諸位在此相逢,我倍感榮幸。在這飛速更迭的時代,我們都渴望一方心靈凈土,而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識,也…

Redux,React-redux。基礎

狀態管理庫,集中式存儲狀態,管理狀態 ? redux //簡單實現 redux源碼 export function createStore(reducer) {// reducer由用戶編寫, 必須是一個函數,dispatch的時候,reducer要執行if (typeof reducer ! function) t…

5.2 位運算專題:LeetCode 268. 丟失的數字

1. 題目鏈接 LeetCode 268. 丟失的數字 2. 題目描述 給定一個包含 [0, n] 范圍內 n 個不同整數的數組 nums(實際長度為 n),找出數組中缺失的那個數字。 示例: 輸入:nums [3,0,1] → 輸出:2(…

基于第三方庫的人臉識別系統的設計與實現

標題:基于第三方庫的人臉識別系統的設計與實現 內容:1.摘要 本文針對傳統人臉識別系統開發復雜、效率低的問題,旨在設計并實現基于第三方庫的人臉識別系統。通過選用合適的第三方人臉識別庫,利用其成熟的算法和接口,簡化系統開發流程。對收集…

【Android】VehiclePropertyAccess引起CarService崩潰

VehiclePropertyAccess引起CarService崩潰 VehiclePropertyAccess VehiclePropertyAccess屬性,用于定義車輛屬性的訪問權限。權限包括 讀:READ,只可以讀取,不能寫入。 VehiclePropertyAccess:READ寫:WRITE&#xf…

【Go】Go語言并發模型:MPG

Go 語言并發模型:MPG Go 的并發模型主要由三個部分構成: M (Machine) 系統線程,用于實際執行任務。 P (Processor) 邏輯處理器,負責管理和調度 goroutine。每個 P 擁有一個本地隊列和關聯的全局 G 隊列。 G (Goroutine) Go 語言…

SpringCloud配置中心:Config Server與配置刷新機制

文章目錄 引言一、Config Server基礎架構1.1 Server端配置1.2 配置文件命名規則 二、Config Client配置2.1 Client端配置2.2 配置注入與使用 三、配置刷新機制3.1 手動刷新配置3.2 使用Spring Cloud Bus實現自動刷新3.3 配置倉庫Webhook自動觸發刷新 四、高級配置管理策略4.1 配…

PyTorch生成式人工智能實戰:從零打造創意引擎

PyTorch生成式人工智能實戰:從零打造創意引擎 0. 前言1. 生成式人工智能1.1 生成式人工智能簡介1.2 生成式人工智能技術 2. Python 與 PyTorch2.1 Python 編程語言2.2 PyTorch 深度學習庫 3. 生成對抗網絡3.1 生成對抗網絡概述3.2 生成對抗網絡應用 4. Transformer4…

allure結合pytest生成測試報告

結合 pytest 和 Allure 可以生成詳細而美觀的測試報告,幫助測試人員和開發者更好地理解測試結果。這包括測試的執行情況、步驟、附件(如截圖)、分類以及優先級標記。下面是如何在 pytest 中使用 Allure 生成測試報告的步驟: 安裝…

STM32標準庫開發中斷流程

在STM32標準外設庫(SPL)開發中,外設中斷的處理流程通常如下: 一、標準庫外設中斷處理流程 (1)使能外設時鐘 在使用任何外設之前,都必須打開外設的時鐘。例如,使用USART1的中斷&…

【計算機網絡】-計算機網絡期末復習題復習資料

一、計算機網絡體系結構(800字) 1. OSI參考模型 七層結構:物理層→數據鏈路層→網絡層→傳輸層→會話層→表示層→應用層 各層核心功能: 物理層:比特流傳輸(如RJ45、光纖接口) 數據鏈路層&…

31天Python入門——第9天:再學函數

你好,我是安然無虞。 文章目錄 再學函數1. 變量在函數中的作用域2. 函數的參數傳遞.補充學習: 不定長參數*args和**kwargs 3. 值傳遞和引用傳遞補充學習: 把函數作為參數傳遞 4. 匿名函數5. python中內置的常用函數zip()map()filter()all()any() 6. 函數練習 再學函…

EasyUI數據表格中嵌入下拉框

效果 代碼 $(function () {// 標記當前正在編輯的行var editorIndex -1;var data [{code: 1,name: 1,price: 1,status: 0},{code: 2,name: 2,price: 2,status: 1}]$(#dg).datagrid({data: data,onDblClickCell:function (index, field, value) {var dg $(this);if(field ! …

【C語言】多進程/多線程

【C語言】多進程/多線程 參考鏈接多進程/多線程服務器1. 多進程服務器2. 多線程服務器 結語參考鏈接 參考鏈接 c 中文網 菜鳥 c 多進程/多線程服務器 多進程和多線程是常用的并發編程技術。它們都允許程序同時執行多個任務,提高了系統的資源利用率和程序的運行效率…

mysql 磐維(opengauss)tidb誤刪數據之高級恢復

Mysql參考: Mysql 8.0 XtraBackupMysqlbinlog 完全恢復 - 墨天輪 Mysql 8.0 XtraBackupMysqlbinlog 完全恢復[TOC]# 一、安裝mysql 8.0.19## 1.1https://www.modb.pro/db/509223MySQL 的全量備份、增量備份與 Binlog 時間點恢復_mysqlbinlog自動備份嗎-CSDN博客文章…

3. 軸指令(omron 機器自動化控制器)——>MC_SetPosition

機器自動化控制器——第三章 軸指令 11 MC_SetPosition變量?輸入變量?輸出變量?輸入輸出變量 功能說明?時序圖?重啟動運動指令?多重啟運動指令?異常 MC_SetPosition 將軸的指令當前位置和反饋當前位置變更為任意值。 指令名稱FB/FUN圖形表現ST表現MC_SetPosition當前位…