OpenHarmony 源碼解析之多媒體子系統(camera)
介紹
媒體子系統為開發者提供一套接口,方便開發者使用系統的媒體資源,本文主要介紹多媒體下的Camera模塊。

camera子系統提供以下功能相關接口 :
- 相機拍照
- 相機預覽
- 相機錄像
架構

原理圖

搭建HarmonyOS環境
我們首先需要完成HarmonyOS開發環境搭建,可參照如下步驟進行。
安裝DevEco Studio,詳情請參考下載和安裝軟件。
設置DevEco Studio開發環境,DevEco Studio開發環境需要依賴于網絡環境,需要連接上網絡才能確保工具的正常使用,可以根據如下兩種情況來配置開發環境:
1.如果可以直接訪問Internet,只需進行下載HarmonyOS SDK操作。
2.如果網絡不能直接訪問Internet,需要通過代理服務器才可以訪問,請參考配置開發環境。
開發者可以參考以下鏈接,完成設備調試的相關配置:
代碼結構解讀

相機模塊
核心類

上層初始化示例
該文件的main方法執行了創建camera的整個流程,并且在創建初始化好了camera后,根據用戶輸入的字符,對camera進行拍照,錄像,預覽功能的執行。

Camkit 是CameraKit類的全局的變量,這個主要提供上層的調用,這個類里面實際是通過cameraManager_對象進行調用相關的方法。圖中主要的流程分為以下幾個步驟:
- 獲取CameraKit實例
- 調用camKit的GetCameraIds方法獲取攝像頭的id列表,根據id列表找到1080P分辨率的攝像頭id,如果沒有找到提示錯誤信息,直接return。
- 調用camKit的CreateCamera方法,這個方法是camera初始化的核心
根據這三個步驟,分析每一個步驟的流程,獲取CameraKit實例這一步,其實一層層調用,實現camera初始化的操作,以下是相關的調用流程
(1)獲取CameraKit流程

(2)GetCameraIds流程

CameraKit調用實際上是通過cameraManager_進行調用

CameraService初始化完成后,通過device和ability創建的CameraImpl實例存入cameraMapCache_變量中, GetCameraIds方法通過遍歷cameraMapCache_來獲取可用的cameraId列表。
(3)CreateCamera流程

CameraKit實際調用了CameraManagerImpl的CreateCamera方法

首先根據cameraId在cameraMapCache_中找到CameraImpl的位置,將CameraStateCallback回調注冊到CamerImpl中,CameraStateCallback是從應用層通過參數傳入進來,所以后續CameraImpl中的Configure,Release,OnCreate,OnCreateFailed等方法會通過回調,調用應用層的接口。最后調用CameraService的CreateCamera方法進行創建camera。

CameraService中主要通過回調OnCameraStatusChange方法,這個是在CameraManagerImpl類中實現的,CameraManagerImpl通過調用CameraService的Initialize(*this)實現回調接口注冊。

接下來看一下CameraManagerImpl類中的回調實現

調用cameraMapCache_中對應cameraId的OnCreate方法,其中device參數是CameraService中創建并傳給CameraImpl的,接下來看一下CameraImpl的OnCreate方法

首先在CameraImpl中保存一份device_, 其次在EventHandler中通過之前注冊的CameraStateCallback回調OnCreate方法,該回調是上層應用實現的,具體如下圖所示

主要配置了FrameStateCallback回調,以及設置了EventHandler,然后保存CameraImpl,應用層拿到了CameraImpl的對象,并且賦值給cam_對象,后續的camera操作都是通過cam_進行的。
上層調用相機功能

應用層根據用戶輸入的字符進行拍照,開始錄像,開始預覽以及停止的操作,以下是拍照,錄像和預覽的時序圖
拍照流程

錄像流程

總結
通過本文的學習可以大致了解Camera的初始化流程,明白Camera的創建過程,并且對Camera的拍照,錄像等功能有詳細的了解。
OpenHarmony代碼中提供了使用camera的