OpenHarmony 源碼解析之多媒體子系統(tǒng)(camera)
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
介紹
媒體子系統(tǒng)為開發(fā)者提供一套接口,方便開發(fā)者使用系統(tǒng)的媒體資源,本文主要介紹多媒體下的Camera模塊。

camera子系統(tǒng)提供以下功能相關(guān)接口 :
- 相機(jī)拍照
- 相機(jī)預(yù)覽
- 相機(jī)錄像
架構(gòu)

原理圖

搭建HarmonyOS環(huán)境
我們首先需要完成HarmonyOS開發(fā)環(huán)境搭建,可參照如下步驟進(jìn)行。
安裝DevEco Studio,詳情請(qǐng)參考下載和安裝軟件。
設(shè)置DevEco Studio開發(fā)環(huán)境,DevEco Studio開發(fā)環(huán)境需要依賴于網(wǎng)絡(luò)環(huán)境,需要連接上網(wǎng)絡(luò)才能確保工具的正常使用,可以根據(jù)如下兩種情況來配置開發(fā)環(huán)境:
1.如果可以直接訪問Internet,只需進(jìn)行下載HarmonyOS SDK操作。
2.如果網(wǎng)絡(luò)不能直接訪問Internet,需要通過代理服務(wù)器才可以訪問,請(qǐng)參考配置開發(fā)環(huán)境。
開發(fā)者可以參考以下鏈接,完成設(shè)備調(diào)試的相關(guān)配置:
代碼結(jié)構(gòu)解讀

相機(jī)模塊
核心類

上層初始化示例
該文件的main方法執(zhí)行了創(chuàng)建camera的整個(gè)流程,并且在創(chuàng)建初始化好了camera后,根據(jù)用戶輸入的字符,對(duì)camera進(jìn)行拍照,錄像,預(yù)覽功能的執(zhí)行。

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

(2)GetCameraIds流程

CameraKit調(diào)用實(shí)際上是通過cameraManager_進(jìn)行調(diào)用

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

CameraKit實(shí)際調(diào)用了CameraManagerImpl的CreateCamera方法

首先根據(jù)cameraId在cameraMapCache_中找到CameraImpl的位置,將CameraStateCallback回調(diào)注冊(cè)到CamerImpl中,CameraStateCallback是從應(yīng)用層通過參數(shù)傳入進(jìn)來,所以后續(xù)CameraImpl中的Configure,Release,OnCreate,OnCreateFailed等方法會(huì)通過回調(diào),調(diào)用應(yīng)用層的接口。最后調(diào)用CameraService的CreateCamera方法進(jìn)行創(chuàng)建camera。

CameraService中主要通過回調(diào)OnCameraStatusChange方法,這個(gè)是在CameraManagerImpl類中實(shí)現(xiàn)的,CameraManagerImpl通過調(diào)用CameraService的Initialize(*this)實(shí)現(xiàn)回調(diào)接口注冊(cè)。

接下來看一下CameraManagerImpl類中的回調(diào)實(shí)現(xiàn)

調(diào)用cameraMapCache_中對(duì)應(yīng)cameraId的OnCreate方法,其中device參數(shù)是CameraService中創(chuàng)建并傳給CameraImpl的,接下來看一下CameraImpl的OnCreate方法

首先在CameraImpl中保存一份device_, 其次在EventHandler中通過之前注冊(cè)的CameraStateCallback回調(diào)OnCreate方法,該回調(diào)是上層應(yīng)用實(shí)現(xiàn)的,具體如下圖所示

主要配置了FrameStateCallback回調(diào),以及設(shè)置了EventHandler,然后保存CameraImpl,應(yīng)用層拿到了CameraImpl的對(duì)象,并且賦值給cam_對(duì)象,后續(xù)的camera操作都是通過cam_進(jìn)行的。
上層調(diào)用相機(jī)功能

應(yīng)用層根據(jù)用戶輸入的字符進(jìn)行拍照,開始錄像,開始預(yù)覽以及停止的操作,以下是拍照,錄像和預(yù)覽的時(shí)序圖
拍照流程

錄像流程

總結(jié)
通過本文的學(xué)習(xí)可以大致了解Camera的初始化流程,明白Camera的創(chuàng)建過程,并且對(duì)Camera的拍照,錄像等功能有詳細(xì)的了解。
OpenHarmony代碼中提供了使用camera的
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)