0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

OpenHarmony Camera源碼工作的整個流程

OpenAtom OpenHarmony ? 來源:OpenAtom OpenHarmony ? 作者:郭岳峰 ? 2022-09-02 10:05 ? 次閱讀

郭岳峰

深圳開鴻數(shù)字產業(yè)發(fā)展有限公司

OS內核開發(fā)工程師

一、簡介

當前,開源在科技進步和產業(yè)發(fā)展中發(fā)揮著越來越重要的作用,OpenAtom OpenHarmony(簡稱“OpenHarmony”)賦予了開發(fā)者孕育創(chuàng)新的種子,也為數(shù)字化產業(yè)發(fā)展開辟了一片土壤。深開鴻是開源的堅定踐行者,基于OpenHarmony聚焦智能物聯(lián)網操作系統(tǒng)(KaihongOS)技術研發(fā)與持續(xù)創(chuàng)新。

OpenHarmony Camera是多媒體子系統(tǒng)中的一個重要模塊,Camera提供了OpenHarmony相機的預覽、拍照和錄像等功能。作為深開鴻的一名OS系統(tǒng)開發(fā)工程師,我長期致力于OpenHarmony框架層的研發(fā)工作,在OpenHarmony相機模塊的拍照、預覽和錄像方面積累了一些經驗,我將圍繞著這三個核心功能對OpenHarmony Camera源碼進行詳細的分析。

二、OpenHarmony相機子系統(tǒng)

(1)系統(tǒng)簡介

相機組件支持相機業(yè)務的開發(fā),開發(fā)者可以通過已開放的接口實現(xiàn)相機硬件的訪問、操作和新功能開發(fā),最常見的操作如:預覽、拍照和錄像等。

366e82d2-29f7-11ed-ba43-dac502259ad0.png

架構圖

相機框架中主要包含會話管理、設備輸入和數(shù)據輸出,設備的輸入和數(shù)據的輸出配置都是在采集會話中完成,會話管理模塊管理相機設備輸入和數(shù)據輸出。應用層在調用相機功能時,首先需要創(chuàng)建采集會話,在配置會話的過程中會將創(chuàng)建的設備輸入和數(shù)據輸出添加到采集會話中。

相機框架中幾個重要的概念

會話管理:對相機采集的生命周期、參數(shù)配置、輸入和輸出的管理。

設備輸入:主要的輸入設備是相機,對相機的輸入參數(shù)進行設置,比如設置閃光燈模式等。

數(shù)據輸出:相機的輸出有拍照輸出、預覽輸出和錄像輸出,分別對應三個不同的類,所以上層需要根據不同的場景創(chuàng)建出不同的數(shù)據輸出。

36a5650e-29f7-11ed-ba43-dac502259ad0.png

相機底層功能圖

相機驅動框架模型對上實現(xiàn)相機HDI接口,對下實現(xiàn)相機Pipeline模型,管理相機各個硬件設備。底層硬件提供了相機設備功能,比如相機的設備管理,包括相機設備枚舉、相機設備能力查詢、流的創(chuàng)建管理以及圖像的捕獲。

(2)功能模塊

會話管理模塊

會話管理模塊的主要功能是配置會話的輸入(設備輸入)和輸出(數(shù)據的輸出),以及控制會話的開始和結束,主要接口有:

3cfbc25e-29f7-11ed-ba43-dac502259ad0.png

設備輸入模塊

相機輸入主要是給會話設置設備的輸入,設備輸入模塊可以設置和獲取輸入設備的參數(shù),比如閃光燈模式、縮放比例、對焦模式等,主要接口有:

3d551ce6-29f7-11ed-ba43-dac502259ad0.png

數(shù)據輸出模塊

數(shù)據輸出模塊根據不同的場景分為拍照輸出、預覽輸出和錄像輸出。其中拍照的輸出是通過PhotoOutput的Capture接口來提供拍照功能,預覽和錄像則是通過StreamRepeat提供的接口實現(xiàn)。主要接口有:

3d9d4cf0-29f7-11ed-ba43-dac502259ad0.png

(3)功能特性或應用場景

相關功能接口:相機拍照、相機預覽、相機錄像。

相機的主要應用場景是拍照、預覽和錄像,以下針對這三個場景進行流程的分析。

3de10fe4-29f7-11ed-ba43-dac502259ad0.png

camera\_standardinterfacesinner_api ative est目錄下應用文件進行拍照、預覽和錄像功能的使用,進行源碼分析。

拍照源碼分析

拍照功能根據camera\_capture.cpp文件中的main方法進行分析,以下列舉了main方法中的主要調用步驟,并且在注釋中介紹核心代碼的功能。

3e0c10b8-29f7-11ed-ba43-dac502259ad0.png

在拍照過程中首先獲取相機管理器實例并獲得相機對象列表,然后創(chuàng)建并配置采集會話(其中包括配置相機輸入、創(chuàng)建消費者Surface以及監(jiān)聽事件、配置拍照輸出),最后拍攝照片,釋放資源。

以下是拍照流程的時序圖,流程只分析到CameraService,后續(xù)的操作是通過Camera的Service和HDI接口進行調用,最終調用到Camera的底層HDF實現(xiàn)。以下對幾個核心代碼進行具體分析。

3f561d06-29f7-11ed-ba43-dac502259ad0.png

① 創(chuàng)建采集會話App側先調用CameraManager的CreateCaptureSession接口。

3fef8e8c-29f7-11ed-ba43-dac502259ad0.png

CameraManager中有一個serviceProxy\_變量,這個變量在CameraManager初始化的時候賦值。

405e17da-29f7-11ed-ba43-dac502259ad0.png

CameraManager中通過serviceProxy\_調用CreateCaptureSession,實際上是調用到HcameraService的CreateCaptureSession接口,新建了HCaptureSession對象,并通過CreateCaptureSession參數(shù)進行返回。

4164baee-29f7-11ed-ba43-dac502259ad0.png

② 創(chuàng)建消費者Surface并注冊監(jiān)聽器以監(jiān)聽緩沖區(qū)更新

調用Surface的CreateSurfaceAsConsumer接口。

41ba1c5a-29f7-11ed-ba43-dac502259ad0.png

創(chuàng)建ConsumerSurface對象,然后對該對象進行初始化操作,Init主要創(chuàng)建BufferQueue并初始化,使用BufferQueue作為參數(shù)創(chuàng)建出BufferQueue的Producer和Consumer,作為數(shù)據生產者和消費者。

42a90144-29f7-11ed-ba43-dac502259ad0.png

創(chuàng)建CaptureSurfaceListener對象。CaptureSurfaceListener繼承IbufferConsumerListener抽象類,實現(xiàn)了OnBufferAvailable接口,capture成功后,在這個接口中通過surface的AcquireBuffer方法來獲取幀數(shù)據,進行保存圖片的處理。

43236c72-29f7-11ed-ba43-dac502259ad0.png

接下來是注冊監(jiān)聽器,方法是調用ConsumerSurface的RegisterConsumerListener接口。

436d56ca-29f7-11ed-ba43-dac502259ad0.png

調用BufferQueueConsumer的RegisterConsumerListener接口,最終是調用到BufferQueue的RegisterConsumerListener接口。

43ac5898-29f7-11ed-ba43-dac502259ad0.png

43f5be02-29f7-11ed-ba43-dac502259ad0.png

③ 拍攝照片

調用PhotoOutput的Capture接口實現(xiàn)拍照功能。

449df5f4-29f7-11ed-ba43-dac502259ad0.png

通過streamCapture\_調用到了HstreamCapture的Capture接口。

44c51cb0-29f7-11ed-ba43-dac502259ad0.png

調用流程來到了StreamOperatorProxy的Capture接口,StreamOperatorProxy是HDI模塊的client端,HDI模塊的client通過IPC調用到HDI的server端進行具體的操作,這個屬于底層調用模塊,暫時不繼續(xù)分析。

預覽源碼分析

預覽功能根據camera\_capture.cpp文件中的main方法進行分析,以下列舉了main方法中的主要調用步驟,并且注釋中介紹核心代碼的功能。

45149146-29f7-11ed-ba43-dac502259ad0.png

在預覽過程中首先獲取相機管理器實例并獲得相機對象列表,然后創(chuàng)建并配置采集會話(其中包括配置相機輸入、創(chuàng)建消費者Surface以及監(jiān)聽事件、配置預覽輸出),最后開始預覽、停止預覽、釋放資源。

以下是預覽流程的時序圖,流程只分析到CameraService,后續(xù)的操作是通過Camera的Service和HDI接口進行調用,最終調用到Camera的底層HDF實現(xiàn)。由于預覽和拍照流程有部分一致,我們只分析差異部分的流程。

4646df2e-29f7-11ed-ba43-dac502259ad0.png

① 創(chuàng)建預覽輸出

首先調用CameraManager的CreateCustomPreviewOutput接口。

4671a722-29f7-11ed-ba43-dac502259ad0.png

調用HcameraService的CreateCustomPreviewOutput的接口,這個接口中會創(chuàng)建HStreamRepeat對象,并將對象賦值給streamRepeat的參數(shù),后續(xù)根據streamRepeat創(chuàng)建PreviewOutput對象返回,PreviewOutput作為預覽的輸出。

474e9ad8-29f7-11ed-ba43-dac502259ad0.png

②開始預覽

首先調用CaptureSession的Start接口。

477f0c40-29f7-11ed-ba43-dac502259ad0.png

接著調用HCaptureSession的Start接口。

47ce4210-29f7-11ed-ba43-dac502259ad0.png

在HCaptureSession的調用中,調用HStreamRepeat的Start接口,HStreamRepeat在上述的創(chuàng)建預覽輸出時創(chuàng)建的對象,最終調用到HStreamRepeat的StartPreview接口。

48143856-29f7-11ed-ba43-dac502259ad0.png

48a590da-29f7-11ed-ba43-dac502259ad0.png

在StartPreview方法中調用streamOperator\_的Capture接口,第三個參數(shù)傳入true,表示連續(xù)抓取數(shù)據。streamOperator\_的調用是在HDI中的操作,屬于底層操作,暫不進行分析。

錄像源碼分析

錄像功能根據camera\_video.cpp文件中的main方法進行分析,以下列舉了main方法中的主要調用步驟,并且注釋中介紹核心代碼的功能。

48e35050-29f7-11ed-ba43-dac502259ad0.png

在錄像過程中首先獲取相機管理器實例并獲得相機對象列表,然后創(chuàng)建并配置采集會話(其中包括配置相機輸入、創(chuàng)建視頻輸出),最后進行視頻的錄制、暫停、恢復和停止。

以下是錄像流程的時序圖,流程只分析到了CameraService相關,后續(xù)的操作是通過Camera的Service和HDI接口進行調用,最終調用到Camera的底層HDF實現(xiàn)。錄像流程跟上述流程基本一致,針對差異流程做相關的源碼分析。

49ec71de-29f7-11ed-ba43-dac502259ad0.png

①創(chuàng)建錄像輸出

首先調用CameraManager的CreateVideoOutput接口,在CameraManager會調用serviceProxy\_變量的CreateVideoOutput.

4a5c2c36-29f7-11ed-ba43-dac502259ad0.png

serviceProxy\_最終會調用到HcameraService的CreateVideoOutput接口,在HcameraService中會創(chuàng)建HStreamRepeat對象,創(chuàng)建成功后會將該對象賦值給CreateVideoOutput的第二個參數(shù)streamRepeat,這個參數(shù)會在CameraManager中作為創(chuàng)建VideoOutput的參數(shù)。

4aab1a44-29f7-11ed-ba43-dac502259ad0.png

②開始錄像

首先調用VideoOutput的Start接口,接著會調用到streamRepeat\_的Start接口。

4ae89c84-29f7-11ed-ba43-dac502259ad0.png

最終由StartVideo接口來實現(xiàn)錄像的功能。

4b11ad5e-29f7-11ed-ba43-dac502259ad0.png

調用streamOperator的Capture接口來進行錄像,其中第二個參數(shù)captureInfoVideo是video相關的信息參數(shù)。

4b383942-29f7-11ed-ba43-dac502259ad0.png

三、總結

本文首先對相機預覽、拍照和錄像功能的應用層進行了代碼分析,其次對框架層的流程進行了梳理,最后再對框架源碼進行分析。希望通過本文能幫助開發(fā)者初步掌握OpenHarmony Camera源碼工作的整個流程。

關于OpenHarmony多媒體子系統(tǒng)方面的內容,我已經發(fā)表過《如何通過OpenHarmony的音頻模塊實現(xiàn)錄音變速功能》《如何通過OpenHarmony系統(tǒng)中集成的ffmpeg庫和NAPI機制,實現(xiàn)更多的多媒體功能?》兩篇文章,感興趣的朋友可以點擊閱讀,希望大家通過學習能夠掌握更多OpenHarmony多媒體子系統(tǒng)的工作原理

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 源碼
    +關注

    關注

    8

    文章

    626

    瀏覽量

    28993
  • Camera
    +關注

    關注

    0

    文章

    78

    瀏覽量

    20714
  • OpenHarmony
    +關注

    關注

    25

    文章

    3558

    瀏覽量

    15784

原文標題:OpenHarmony Camera源碼分析

文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何獲取OpenHarmonyOS源碼

    源碼獲取OpenHarmony介紹OpenHarmony是HarmonyOS的開源版,由華為捐贈給開放原子開源基金會(OpenAtom Foundation)開源。第一個開源版本支持在128KB
    發(fā)表于 09-10 18:03

    HarmonyOS學習之四:OpenHarmony源碼下載及構成簡介

    /manifest.git -b master二、源碼目錄說明OpenHarmony的主要源碼的目錄及說明如下:applications:應用程序樣例,包括wifi-iot,camera
    發(fā)表于 11-26 09:42

    android camera驅動流程是怎樣的?

    android camera驅動流程是怎樣的?
    發(fā)表于 03-03 08:04

    OpenHarmony下載

    OpenHarmony官方認證后,貢獻代碼到OpenHarmony社區(qū)。修復OpenHarmony的問題。學習OpenHarmony源碼
    發(fā)表于 03-09 18:36

    AP側中網相關的PLMN業(yè)務源碼流程解讀

    搜網流程可以簡單概括為 PLMN 選擇、小區(qū)搜索、網絡注冊,而 PLMN 選擇主要在 cp 側完成,而 PLMN在 OpenHarmony 源碼中(即 AP 側)主要涉及到的業(yè)務就是搜網模塊中
    發(fā)表于 03-24 15:48

    如何導入OpenHarmony源碼

      Import Project適用于打開DevEco Device Tool創(chuàng)建的工程項目和獲取的OpenHarmony源碼。如果是打開OpenHarmony源碼,在打開工程時,點擊
    發(fā)表于 04-12 11:16

    三步就能在OpenHarmony中實現(xiàn)車牌識別

    識別結果如下所示:開發(fā)流程本車牌識別項目使用 OpenHarmony 中的媒體子系統(tǒng)實現(xiàn)。代碼基于停車場景下的本地車牌識別。進行講解,其代碼結構如下:三方庫移植EasyPR 實現(xiàn)是基于 OpenCV
    發(fā)表于 07-06 11:20

    OpenHarmony開發(fā)——系統(tǒng)源碼編譯

    背景隨著OpenHarmony-v3.1的發(fā)布,越來越多的開發(fā)者將目光聚焦到OpenHarmony系統(tǒng)開發(fā)上。對于首次接觸OpenHarmony的開發(fā)者來說,如何進行源碼編譯是一個大難
    發(fā)表于 08-30 10:08

    OpenHarmony Camera源碼分析

    OpenHarmony Camera源碼工作整個流程。關于
    發(fā)表于 09-06 11:21

    IP camera的開源系統(tǒng)

    Xilinx FPGA工程例子源碼:IP camera的開源系統(tǒng)
    發(fā)表于 06-07 14:13 ?13次下載

    openharmony刷機教程 源碼獲取概述

    。許多人搞不懂openharmony如何用,下面小編帶來openharmony刷機教程。 openharmony從代碼倉庫源碼獲取概述 首先注冊碼云gitee賬號以及碼云SSH公鑰,之
    的頭像 發(fā)表于 06-22 10:37 ?2540次閱讀

    openharmony升級 openharmony源碼獲取

    openharmony源碼獲取 適合剛接觸OpenHarmony不久、想進行快速開發(fā)的用戶。能夠在在HPM網站獲取下載開源發(fā)行版,或者在開源發(fā)行版的基礎上定制。之后用hpm-cli把相關的組件還有工具下載安裝。 首先自己要安裝好
    的頭像 發(fā)表于 06-23 09:51 ?1875次閱讀

    openharmony源碼地址 openharmony編譯運行

    一、Openharmony源碼地址以及獲取方式 開源代碼倉庫地址:https://openharmony.gitee.com 1:從鏡像站點下載歸檔后的發(fā)行版壓縮文件。 2:通過HPM包管理器獲取
    的頭像 發(fā)表于 06-23 10:49 ?2528次閱讀

    openharmony源碼解讀

    如何獲取OpenHarmony源碼并說明OpenHarmony源碼目錄結構。OpenHarmony的代碼以組件的形式開放,開發(fā)者可以通過如
    的頭像 發(fā)表于 06-24 09:29 ?3706次閱讀

    鴻蒙OpenHarmony【創(chuàng)建工程并獲取源碼

    在通過DevEco Device Tool創(chuàng)建OpenHarmony工程時,可自動下載相應版本的OpenHarmony源碼。
    的頭像 發(fā)表于 04-19 21:40 ?275次閱讀
    鴻蒙<b class='flag-5'>OpenHarmony</b>【創(chuàng)建工程并獲取<b class='flag-5'>源碼</b>】