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