Android Camera API2架構和流程介紹

和你一起終身學習,這里是程序員 Android

經典好文推薦,通過閱讀本文,您將收獲以下知識點:

一、簡介
二、Camera API2 架構
2.1 Camera應用框架
2.2 Camera AIDL
2.3 Camera Native 框架
2.4 Camera binder IPC 接口
2.5 CameraService
2.6 Camera HAL
三、Camera API 2 操作流程
3.1 Camera參數獲取操作
3.2 openCamera操作
3.3 CreateCaptureSession
3.4 request下發(起預覽、拍照等操作)
3.5 Camera Hal回幀
四、參考

一、簡介

Camera API 2 (下面用Camera2簡稱)是最新的 Android 相機框架 API,它取代了已棄用的相機框架庫(Camera API 1)。 Camera2 為復雜的用例提供深入的控制,但需要用戶管理特定于設備的配置。用戶可以在相應的參考文檔中了解 Camera2 中的特定類和函數。總體上Camera遵循Client-Server架構,通過Binder通訊完成Camera APP -> Camera API2 -> CameraService -> Camera Hal流程。

二、Camera API2 架構

圖2.1描述了Camera整體軟件架構。


圖2.1 Camera軟件架構

Camera軟件架構圖從上到下可分為Camera應用框架、Camera AIDL、Camera Native 框架、Camera binder IPC 接口、Camera HAL六大部分。

2.1 Camera應用框架

Camera應用框架是Camera APP代碼,它使用 Camera2 API 與Camera硬件進行交互,交互過程中會調用相應的 Binder 接口,以訪問與Camera底層交互的原生代碼。

Camera API2中CameraManager用于openCamera、CameraDevice用于創建CameraCaptureSession(配流)。

2.2 Camera AIDL

Camera AIDL接口是Camera API2與CameraService的連接橋梁,與 CameraService關聯的 binder 接口可在frameworks/av/camera/aidl/android/hardware中找到。生成的代碼會調用Camera hal的原生代碼以獲取對實體Camera的訪問權限,并返回用于在框架級別創建 CameraDevice并最終創建 CameraCaptureSession對象的數據。

2.3 Camera Native 框架

此框架位于 frameworks/av/中,并提供相當于 CameraDevice和 CameraCaptureSession類的原生類,另請參閱 NDK camera2 參考。Camera Native框架包含了CameraService、Camera metadata等

2.4 Camera binder IPC 接口

IPC binder 接口用于實現跨越進程邊界的通信。調用相機服務的若干個相機 binder 類位于 /frameworks/av/camera/aidl/android/hardware/目錄中。

  • ICameraService 是相機服務的接口;
  • ICameraDeviceUser 是已打開的特定相機設備的接口;
  • ICameraServiceListener 和 ICameraDeviceCallbacks 分別是對應用框架的 CameraService 和 CameraDevice 回調接口。
2.5 CameraService

路徑: frameworks/av/services/camera/libcameraservice/CameraService.cpp ,相機服務是與 HAL 進行互動的實際代碼。

2.6 Camera HAL

硬件抽象層定義了由相機服務調用、且您必須實現以確保相機硬件正常運行的標準接口。

三、Camera API 2 操作流程

圖 3.1 Camera API 2 操作流程

Camera API2的核心操作流程如圖3.1。從左到右分為三個模塊,分別是Camera APP、Camera2 API、Camera Device HardWare(由Camera hal控制)。

下面簡要介紹Camera API2操作流程:

3.1 Camera參數獲取操作

當app調用 Context.getSystemService()獲得CameraManager后。其一,需要通過CameraManager對象注冊Camera可用的回調(AvailabilityCallback),用于判斷Camera是否可用,可用的狀態下才執行CameraManager.openCamera操作;其二,需要通過getCameraIdList獲取可用的Camera邏輯id;其三,通過getCameraCharacteristics獲取Camera Characteristic信息,如Camera尺寸,3A參數等描述CameraDevice的信息。

3.2 openCamera操作

CameraManager.openCamera用于打開相機,openCamera成功會返回CameraDevice,失敗會返回錯誤碼。詳見/frameworks/base/core/java/android/hardware/camera2/CameraDevice.java,app側可通過重寫的 CameraDevice.StateCallback 的 onOpened、onDisconnected、onError 方法得知當前 CameraDevice 的狀態。

openCamera簡要流程:CameraManager.openCamera - > CameraService.connectDevice -> CameraManagerProvider.openSession -> Camera hal openCamera。

3.3 CreateCaptureSession

CameraDevice.CreateCaptureSession就是配流的操作,一般配置預覽、拍照、錄像流,對應的surface有surfaceview或者surfaceTexture、imageReader創建的surface、MediaRecorder;配流會配置設置默認的CaptureRequest模板參數,如預覽的CameraDevice.TEMPLATE_PREVIEW,錄像的CameraDevice.TEMPLATE_RECORD,拍照的CameraDevice.TEMPLATE_STILL_CAPTURE。配流可以理解為配置流的輸出容器,以Camera hal為buffer的生產者,那么就是配置outConfigurations。

  • CreateCaptureSession簡要流程:CameraDevice.CreateCaptureSession -> CameraDeviceImpl.createStreams -> CameraDeviceClient.mHidlSession.configureStreams -> Camera hal configureStreams。

3.4 request下發(起預覽、拍照等操作)

request下發是是processCaptureRequest流程。配流完成后,通過CameraCaptureSession.StateCallback可以獲取CameraCaptureSession對象用于后續的起預覽(setRepeatingRequest)、拍照或者對焦(capture)、停預覽(stopRepeating)、關相機操作(abortCaptures)等操作,這些操作都是通過下發request或者移除request實現,其中,預覽request連續的,拍照的request是單一的,預覽和拍照的request都會放到隊列中,然后下發到camera hal。app只需通過setRepeatingRequest下發預覽的request,而預覽request的循環下發在/frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cpp的RequestThread:threadloop中完成,預覽輪轉buffer個數是4。

值得注意的是:拍照的優先級高于預覽的優先級,如果預覽的過程中收到拍照的請求,會以插隊的形式將拍照的請求查到隊列中。

3.5 Camera Hal回幀

Camera Hal回幀是processCaptureResult流程。processCaptureResult流程是camera hal buffer和參數回調的過程。大致流程是:其一,Camera hal將預覽幀或者拍照幀的buffer填充到app配流的surface中,如果時預覽幀,surface通過queen buffer形式消費buff;如果是拍照幀,拍照的buffer返回給app,app做圖片保存。其二是。Camera hal將處理的預覽幀和拍照幀的參數信息通過metadata返回給app。

Camera API2關鍵操作流程見圖 3.2 。


圖 3.2 Camera API2關鍵操作流程

四、參考
https://source.android.google.cn/docs/core/camera?hl=enhuoqhuo'q

原文鏈接:https://blog.csdn.net/qq_37695230/article/details/131803939

至此,本篇已結束。轉載網絡的文章,小編覺得很優秀,歡迎點擊閱讀原文,支持原創作者,如有侵權,懇請聯系小編刪除,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容