郭岳峰
深圳開鴻數(shù)字產(chǎn)業(yè)發(fā)展有限公司
OS內(nèi)核開發(fā)工程師
一、簡介
當(dāng)前,開源在科技進(jìn)步和產(chǎn)業(yè)發(fā)展中發(fā)揮著越來越重要的作用,OpenAtom OpenHarmony(簡稱“OpenHarmony”)賦予了開發(fā)者孕育創(chuàng)新的種子,也為數(shù)字化產(chǎn)業(yè)發(fā)展開辟了一片土壤。深開鴻是開源的堅定踐行者,基于OpenHarmony聚焦智能物聯(lián)網(wǎng)操作系統(tǒng)(KaihongOS)技術(shù)研發(fā)與持續(xù)創(chuàng)新。
OpenHarmony Camera是多媒體子系統(tǒng)中的一個重要模塊,Camera提供了OpenHarmony相機(jī)的預(yù)覽、拍照和錄像等功能。作為深開鴻的一名OS系統(tǒng)開發(fā)工程師,我長期致力于OpenHarmony框架層的研發(fā)工作,在OpenHarmony相機(jī)模塊的拍照、預(yù)覽和錄像方面積累了一些經(jīng)驗,我將圍繞著這三個核心功能對OpenHarmony Camera源碼進(jìn)行詳細(xì)的分析。
二、OpenHarmony相機(jī)子系統(tǒng)
(1)系統(tǒng)簡介
相機(jī)組件支持相機(jī)業(yè)務(wù)的開發(fā),開發(fā)者可以通過已開放的接口實(shí)現(xiàn)相機(jī)硬件的訪問、操作和新功能開發(fā),最常見的操作如:預(yù)覽、拍照和錄像等。
架構(gòu)圖
相機(jī)框架中主要包含會話管理、設(shè)備輸入和數(shù)據(jù)輸出,設(shè)備的輸入和數(shù)據(jù)的輸出配置都是在采集會話中完成,會話管理模塊管理相機(jī)設(shè)備輸入和數(shù)據(jù)輸出。應(yīng)用層在調(diào)用相機(jī)功能時,首先需要創(chuàng)建采集會話,在配置會話的過程中會將創(chuàng)建的設(shè)備輸入和數(shù)據(jù)輸出添加到采集會話中。
相機(jī)框架中幾個重要的概念
會話管理:對相機(jī)采集的生命周期、參數(shù)配置、輸入和輸出的管理。
設(shè)備輸入:主要的輸入設(shè)備是相機(jī),對相機(jī)的輸入?yún)?shù)進(jìn)行設(shè)置,比如設(shè)置閃光燈模式等。
數(shù)據(jù)輸出:相機(jī)的輸出有拍照輸出、預(yù)覽輸出和錄像輸出,分別對應(yīng)三個不同的類,所以上層需要根據(jù)不同的場景創(chuàng)建出不同的數(shù)據(jù)輸出。
相機(jī)底層功能圖
相機(jī)驅(qū)動框架模型對上實(shí)現(xiàn)相機(jī)HDI接口,對下實(shí)現(xiàn)相機(jī)Pipeline模型,管理相機(jī)各個硬件設(shè)備。底層硬件提供了相機(jī)設(shè)備功能,比如相機(jī)的設(shè)備管理,包括相機(jī)設(shè)備枚舉、相機(jī)設(shè)備能力查詢、流的創(chuàng)建管理以及圖像的捕獲。
(2)功能模塊
會話管理模塊
會話管理模塊的主要功能是配置會話的輸入(設(shè)備輸入)和輸出(數(shù)據(jù)的輸出),以及控制會話的開始和結(jié)束,主要接口有:
設(shè)備輸入模塊
相機(jī)輸入主要是給會話設(shè)置設(shè)備的輸入,設(shè)備輸入模塊可以設(shè)置和獲取輸入設(shè)備的參數(shù),比如閃光燈模式、縮放比例、對焦模式等,主要接口有:
數(shù)據(jù)輸出模塊
數(shù)據(jù)輸出模塊根據(jù)不同的場景分為拍照輸出、預(yù)覽輸出和錄像輸出。其中拍照的輸出是通過PhotoOutput的Capture接口來提供拍照功能,預(yù)覽和錄像則是通過StreamRepeat提供的接口實(shí)現(xiàn)。主要接口有:
(3)功能特性或應(yīng)用場景
相關(guān)功能接口:相機(jī)拍照、相機(jī)預(yù)覽、相機(jī)錄像。
相機(jī)的主要應(yīng)用場景是拍照、預(yù)覽和錄像,以下針對這三個場景進(jìn)行流程的分析。
camera\_standardinterfacesinner_api ative est目錄下應(yīng)用文件進(jìn)行拍照、預(yù)覽和錄像功能的使用,進(jìn)行源碼分析。
拍照源碼分析
拍照功能根據(jù)camera\_capture.cpp文件中的main方法進(jìn)行分析,以下列舉了main方法中的主要調(diào)用步驟,并且在注釋中介紹核心代碼的功能。
在拍照過程中首先獲取相機(jī)管理器實(shí)例并獲得相機(jī)對象列表,然后創(chuàng)建并配置采集會話(其中包括配置相機(jī)輸入、創(chuàng)建消費(fèi)者Surface以及監(jiān)聽事件、配置拍照輸出),最后拍攝照片,釋放資源。
以下是拍照流程的時序圖,流程只分析到CameraService,后續(xù)的操作是通過Camera的Service和HDI接口進(jìn)行調(diào)用,最終調(diào)用到Camera的底層HDF實(shí)現(xiàn)。以下對幾個核心代碼進(jìn)行具體分析。
① 創(chuàng)建采集會話App側(cè)先調(diào)用CameraManager的CreateCaptureSession接口。
CameraManager中有一個serviceProxy\_變量,這個變量在CameraManager初始化的時候賦值。
CameraManager中通過serviceProxy\_調(diào)用CreateCaptureSession,實(shí)際上是調(diào)用到HcameraService的CreateCaptureSession接口,新建了HCaptureSession對象,并通過CreateCaptureSession參數(shù)進(jìn)行返回。
② 創(chuàng)建消費(fèi)者Surface并注冊監(jiān)聽器以監(jiān)聽緩沖區(qū)更新
調(diào)用Surface的CreateSurfaceAsConsumer接口。
創(chuàng)建ConsumerSurface對象,然后對該對象進(jìn)行初始化操作,Init主要創(chuàng)建BufferQueue并初始化,使用BufferQueue作為參數(shù)創(chuàng)建出BufferQueue的Producer和Consumer,作為數(shù)據(jù)生產(chǎn)者和消費(fèi)者。
創(chuàng)建CaptureSurfaceListener對象。CaptureSurfaceListener繼承IbufferConsumerListener抽象類,實(shí)現(xiàn)了OnBufferAvailable接口,capture成功后,在這個接口中通過surface的AcquireBuffer方法來獲取幀數(shù)據(jù),進(jìn)行保存圖片的處理。
接下來是注冊監(jiān)聽器,方法是調(diào)用ConsumerSurface的RegisterConsumerListener接口。
調(diào)用BufferQueueConsumer的RegisterConsumerListener接口,最終是調(diào)用到BufferQueue的RegisterConsumerListener接口。
③ 拍攝照片
調(diào)用PhotoOutput的Capture接口實(shí)現(xiàn)拍照功能。
通過streamCapture\_調(diào)用到了HstreamCapture的Capture接口。
調(diào)用流程來到了StreamOperatorProxy的Capture接口,StreamOperatorProxy是HDI模塊的client端,HDI模塊的client通過IPC調(diào)用到HDI的server端進(jìn)行具體的操作,這個屬于底層調(diào)用模塊,暫時不繼續(xù)分析。
預(yù)覽源碼分析
預(yù)覽功能根據(jù)camera\_capture.cpp文件中的main方法進(jìn)行分析,以下列舉了main方法中的主要調(diào)用步驟,并且注釋中介紹核心代碼的功能。
在預(yù)覽過程中首先獲取相機(jī)管理器實(shí)例并獲得相機(jī)對象列表,然后創(chuàng)建并配置采集會話(其中包括配置相機(jī)輸入、創(chuàng)建消費(fèi)者Surface以及監(jiān)聽事件、配置預(yù)覽輸出),最后開始預(yù)覽、停止預(yù)覽、釋放資源。
以下是預(yù)覽流程的時序圖,流程只分析到CameraService,后續(xù)的操作是通過Camera的Service和HDI接口進(jìn)行調(diào)用,最終調(diào)用到Camera的底層HDF實(shí)現(xiàn)。由于預(yù)覽和拍照流程有部分一致,我們只分析差異部分的流程。
① 創(chuàng)建預(yù)覽輸出
首先調(diào)用CameraManager的CreateCustomPreviewOutput接口。
調(diào)用HcameraService的CreateCustomPreviewOutput的接口,這個接口中會創(chuàng)建HStreamRepeat對象,并將對象賦值給streamRepeat的參數(shù),后續(xù)根據(jù)streamRepeat創(chuàng)建PreviewOutput對象返回,PreviewOutput作為預(yù)覽的輸出。
②開始預(yù)覽
首先調(diào)用CaptureSession的Start接口。
接著調(diào)用HCaptureSession的Start接口。
在HCaptureSession的調(diào)用中,調(diào)用HStreamRepeat的Start接口,HStreamRepeat在上述的創(chuàng)建預(yù)覽輸出時創(chuàng)建的對象,最終調(diào)用到HStreamRepeat的StartPreview接口。
在StartPreview方法中調(diào)用streamOperator\_的Capture接口,第三個參數(shù)傳入true,表示連續(xù)抓取數(shù)據(jù)。streamOperator\_的調(diào)用是在HDI中的操作,屬于底層操作,暫不進(jìn)行分析。
錄像源碼分析
錄像功能根據(jù)camera\_video.cpp文件中的main方法進(jìn)行分析,以下列舉了main方法中的主要調(diào)用步驟,并且注釋中介紹核心代碼的功能。
在錄像過程中首先獲取相機(jī)管理器實(shí)例并獲得相機(jī)對象列表,然后創(chuàng)建并配置采集會話(其中包括配置相機(jī)輸入、創(chuàng)建視頻輸出),最后進(jìn)行視頻的錄制、暫停、恢復(fù)和停止。
以下是錄像流程的時序圖,流程只分析到了CameraService相關(guān),后續(xù)的操作是通過Camera的Service和HDI接口進(jìn)行調(diào)用,最終調(diào)用到Camera的底層HDF實(shí)現(xiàn)。錄像流程跟上述流程基本一致,針對差異流程做相關(guān)的源碼分析。
①創(chuàng)建錄像輸出
首先調(diào)用CameraManager的CreateVideoOutput接口,在CameraManager會調(diào)用serviceProxy\_變量的CreateVideoOutput.
serviceProxy\_最終會調(diào)用到HcameraService的CreateVideoOutput接口,在HcameraService中會創(chuàng)建HStreamRepeat對象,創(chuàng)建成功后會將該對象賦值給CreateVideoOutput的第二個參數(shù)streamRepeat,這個參數(shù)會在CameraManager中作為創(chuàng)建VideoOutput的參數(shù)。
②開始錄像
首先調(diào)用VideoOutput的Start接口,接著會調(diào)用到streamRepeat\_的Start接口。
最終由StartVideo接口來實(shí)現(xiàn)錄像的功能。
調(diào)用streamOperator的Capture接口來進(jìn)行錄像,其中第二個參數(shù)captureInfoVideo是video相關(guān)的信息參數(shù)。
三、總結(jié)
本文首先對相機(jī)預(yù)覽、拍照和錄像功能的應(yīng)用層進(jìn)行了代碼分析,其次對框架層的流程進(jìn)行了梳理,最后再對框架源碼進(jìn)行分析。希望通過本文能幫助開發(fā)者初步掌握OpenHarmony Camera源碼工作的整個流程。
關(guān)于OpenHarmony多媒體子系統(tǒng)方面的內(nèi)容,我已經(jīng)發(fā)表過《如何通過OpenHarmony的音頻模塊實(shí)現(xiàn)錄音變速功能》《如何通過OpenHarmony系統(tǒng)中集成的ffmpeg庫和NAPI機(jī)制,實(shí)現(xiàn)更多的多媒體功能?》兩篇文章,感興趣的朋友可以點(diǎn)擊閱讀,希望大家通過學(xué)習(xí)能夠掌握更多OpenHarmony多媒體子系統(tǒng)的工作原理。
審核編輯:湯梓紅
-
源碼
+關(guān)注
關(guān)注
8文章
667瀏覽量
30117 -
Camera
+關(guān)注
關(guān)注
0文章
79瀏覽量
21322 -
OpenHarmony
+關(guān)注
關(guān)注
26文章
3812瀏覽量
18046
原文標(biāo)題:OpenHarmony Camera源碼分析
文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
2K0300 OpenHarmony源碼構(gòu)建指南
如何獲取OpenHarmonyOS源碼?
HarmonyOS學(xué)習(xí)之四:OpenHarmony源碼下載及構(gòu)成簡介
OpenHarmony下載
AP側(cè)中網(wǎng)相關(guān)的PLMN業(yè)務(wù)源碼流程解讀
如何導(dǎo)入OpenHarmony源碼
OpenHarmony開發(fā)——系統(tǒng)源碼編譯
openharmony刷機(jī)教程 源碼獲取概述
openharmony升級 openharmony源碼獲取
openharmony源碼地址 openharmony編譯運(yùn)行
openharmony源碼解讀
鴻蒙OpenHarmony【創(chuàng)建工程并獲取源碼】

評論