基本概念
相機是OpenHarmony多媒體進程提供的服務之一,提供了相機的錄像、預覽、拍照功能,支持多用戶并發(fā)取流。
在進行應用的開發(fā)前,開發(fā)者應了解以下基本概念:
- 視頻幀
視頻流指的是將一系列圖片數(shù)據(jù)按照固定時間間隔排列形成的數(shù)據(jù)流,每一張圖片數(shù)據(jù)成為一幀,這樣的一幀稱為視頻幀。 - 幀速率(FPS,F(xiàn)rames Per Second)
視頻播放每秒鐘刷新圖片的速度,或是視頻每秒的幀數(shù),幀速率越高,視頻的觀感越流暢。 - 分辨率
每一幀的圖片信息都是由像素點組成的,分辨率描述了一張圖片中像素點的個數(shù)。例如1920*1080(1080P),是指圖片寬1920像素,高1080像素。
運作機制
多媒體服務進程
多媒體服務作為系統(tǒng)服務,在系統(tǒng)啟動時由Init進程拉起,并初始化和分配媒體硬件資源(內(nèi)存/顯示硬件/圖像傳感器/編解碼器等)。初始化過程解析配置文件,確定了多媒體各個服務的能力和資源上限,通常由OEM廠商通過配置文件進行配置。相機服務在多媒體進程初始化時有以下配置項:關(guān)鍵類的解釋
應用通過持有下面4個類,配置和使用Camera的功能,包括了Camera類和它的三個異步回調(diào)類,三類回調(diào)分別對應了不同類型的異步處理場景,詳見下表。
表1 關(guān)鍵類的解釋對象 用途 舉例 Camera 對相機進行靜態(tài)配置(通過配置類),觸發(fā)相機基本功能 拍照/錄像/預覽 CameraDeviceCallback 處理相機硬件狀態(tài)變化 可用/不可用 CameraStateCallback 處理camera自身狀態(tài)變化 創(chuàng)建/釋放 FrameStateCallback 處理幀狀態(tài)的變化 拍照開始和結(jié)束/幀率發(fā)生變化 流的傳遞
Surface是多媒體傳遞音視頻的基本數(shù)據(jù)結(jié)構(gòu),Camera一般作為Surface中數(shù)據(jù)的生產(chǎn)者,在不同的場景下有特定的消費者。
相機的預覽和錄像輸出均為視頻流,拍照輸出為圖像幀,二者均通過Surface類進行傳遞。Surface類可以屏蔽進程內(nèi)/跨進程的場景,進行多媒體信息流的傳遞。
以錄像為例,用戶首先創(chuàng)建Recorder實例,并從Recorder中獲取對應Surface,再將此Surface傳遞給Camera實例,此時Camera將作為生產(chǎn)者向Surface注入視頻流,而Recorder作為消費者從Surface中取出視頻流進行保存,用戶的行為類似橋接,把二者通過Surface連接起來。
類似的,用戶也可以自行創(chuàng)建Surface傳遞給Camera實例,并實現(xiàn)消費者邏輯(例如通過網(wǎng)絡傳輸視頻流,或是將拍照的幀數(shù)據(jù)保存成圖片文件)。
圖形圖像模塊也通過Surface從Camera獲取流資源
鴻蒙開發(fā)指導文檔:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md
]
小型系統(tǒng)圖形圖像框架介紹
概述
小型系統(tǒng)圖形圖像子系統(tǒng)是一套輕量級圖形框架,框架包括輕量級 UI 控件、動畫、事件、2D 圖形庫、字體布局引擎、多后端渲染和窗口管理等模塊,主要用于運動手表、智能家居等小型帶屏設備的圖形 UI 顯示。
OpenHarmony 中各 UI 之間的關(guān)系
當前對于 OpenHarmony 應用界面開發(fā),你可能已經(jīng)了解到幾個不同的概念,比如 ArkUI 聲明式開發(fā)范式、ArkUI 類 Web 開發(fā)范式等,那他們和當前小型系統(tǒng)圖形圖像框架之間是什么關(guān)系呢?
當前 [ace_engine]實現(xiàn)了標準系統(tǒng)的 ArkUI 聲明式開發(fā)范式和 ArkUI 類 Web 開發(fā)范式兩套開發(fā)框架;根據(jù)小型系統(tǒng)的特點 [ace_engine_lite]實現(xiàn)了輕量級的 ArkUI 類 Web 開發(fā)范式 lite 版本,其能力是 ArkUI 類 Web 開發(fā)范式的子集。
按照系統(tǒng)類型分類如下:
- 標準系統(tǒng):
- ArkUI 聲明式開發(fā)范式 (推薦)
- ArkUI 類 Web 開發(fā)范式
- 小型系統(tǒng):
- ArkUI 類 Web 開發(fā)范式 Lite
- C++ (系統(tǒng)應用)
小型系統(tǒng)圖形圖像框架中的 [ui_lite] 和 [ace_engine_lite]、 [ace_engine]的代碼實現(xiàn)關(guān)系如下圖:
如何確定應用開發(fā)所需的 API 套件?對于標準系統(tǒng),優(yōu)先選擇 ArkUI 聲明式開發(fā)范式;對于小型系統(tǒng),請優(yōu)先考慮使用 ArkUI 類 Web 開發(fā)范式 lite。而在某些配置較低的設備上進行系統(tǒng)應用開發(fā)時,則可以考慮選擇 C++ API,因為相比類 Web 范式,它具有更高的性能和更好的靈活性。
UI 控件
實現(xiàn)各種控件,如按鈕、文本、進度條等各種基本控件。
提供列表、Swiper、圖片序列幀等復雜控件。
布局
實現(xiàn)網(wǎng)格布局、靈活布局(如居中、左對齊、右對齊)。
布局為一次性布局。布局函數(shù)每運行一次,會計算一次控件的位置,但是控件位置由其他方式改變時(如拖動),其他相關(guān)聯(lián)的控件位置不會自動發(fā)生變化,需要重新調(diào)用一次布局函數(shù)。
動畫
框架支持自定義動畫,所有動畫由 AnimatorManager 管理,根據(jù)屏幕刷新事件,由 AnimatorManager 周期性調(diào)用回調(diào)函數(shù)處理修改屬性變化,然后觸發(fā)刷新重新繪制組件,達到組件動畫效果。
提供動畫的開始/停止、暫停/恢復、創(chuàng)建/銷毀等各種操作 ,用于實現(xiàn)動畫效果。
事件
Input 事件包括觸摸屏觸摸輸入事件和物理按鍵輸入事件,引擎每運行一次,InputManager 是管理所有輸入設備的模塊,GUI 引擎每運行一次,InputManager 會讀取一次所有注冊的硬件設備的輸入,轉(zhuǎn)化為各種事件供UI控件使用。
繪制
2D 圖形繪制: 實現(xiàn)線、矩形、三角形、弧線的繪制操作。
圖像繪制:實現(xiàn)各種類型圖片的繪制能力,如 RGB565、RGB888、ARGB8888、PNG、JPG 格式。
字體繪制:支持矢量字體的實時繪制、布局排版。
實現(xiàn)原理
小型系統(tǒng)圖形框架中,任務隊列由屏幕刷新同步信號驅(qū)動。每個任務都是一個 task,并存放在任務隊列中。周期性的屏幕刷新信號觸發(fā)周期性回調(diào),從而循環(huán)驅(qū)動任務隊列中的 task 執(zhí)行。輸入事件、動畫和渲染等操作均作為單獨的 task 運行。
事件交互
當前圖形框架支持觸摸事件(PointerInputDevice)、按鍵事件(KeyInputDevice)、旋轉(zhuǎn)表冠事件(RotateInputDevice)。
輸入事件相關(guān)類圖如上,每類輸入事件根據(jù)自己特點,重寫 InputDevice 基類的 Read 函數(shù),讀取對應的輸入數(shù)據(jù),然后根據(jù)輸入數(shù)據(jù)生成對應的事件分發(fā)給 UI 控件,如 PointerInputDevice 讀取觸摸的坐標點,根據(jù)坐標點,從組件樹查找當前坐標對應的控件,生成對應的點擊、長按、拖拽事件,分發(fā)給對應控件。
動效框架
每一個自定義動畫都需要繼承自 Animator 類,實現(xiàn) AnimatorCallback 的 Callback 接口。所有的 Animator 都由 AnimatorManager 統(tǒng)一管理。 Callback 接口入?yún)楫斍皠赢嫷?View,可以通過修改 View 對應的屬性來產(chǎn)生動畫效果,如坐標位置、顏色變換、縮放效果等。
渲染框架
- 每一個窗口 Window 持有一個 RootView
- RootView 為當前窗口的根節(jié)點,當前窗口所有控件都必須掛載在 RootView 下才能顯示
- UIView 為所有 View 的基類,每個 View 實現(xiàn)自己的 OnDraw 繪制函數(shù)
- 每個 View 顯示發(fā)生變化時,調(diào)用 Invalidate 函數(shù),將當前區(qū)域標記為臟區(qū)域
- RootView 統(tǒng)一管理當前窗口所有的臟區(qū)域信息
- 每次刷新信號觸發(fā),會遍歷繪制所有的 Window,每個 Window 從 RootView 開始先進行 Measure 布局,然后調(diào)用 Render 函數(shù)繪制,遍歷繪制所有臟區(qū)域內(nèi)的 View。
- 相機運行流程
- Camera創(chuàng)建流程
本進程通過CameraManager創(chuàng)建Camera實例,并從服務端綁定camera設備,創(chuàng)建成功后異步通知developer。類之間的時序圖如下:
圖1 Camera創(chuàng)建時序圖 - Camera錄像/預覽流程
開發(fā)者首先通過CameraKit創(chuàng)建Camera,然后FrameConfig類對錄像或者預覽幀屬性進行配置。錄像/預覽時序如下:
圖2 Camera錄像/預覽時序圖
- Camera創(chuàng)建流程
審核編輯 黃宇
-
鴻蒙
+關(guān)注
關(guān)注
60文章
2620瀏覽量
44042 -
HarmonyOS
+關(guān)注
關(guān)注
80文章
2126瀏覽量
33028 -
OpenHarmony
+關(guān)注
關(guān)注
29文章
3854瀏覽量
18601
發(fā)布評論請先 登錄
HarmonyOS IoT 硬件開發(fā)案例分享
【潤和直播課預告@華為開發(fā)者學院】HarmonyOS設備開發(fā)基礎課程|HiSpark WiFi-IoT 智能小車套件開發(fā)案例
Linux應用開發(fā)手冊之Python開發(fā)案例
許思維老師HarmonyOS IoT硬件開發(fā)案例分享

華為開發(fā)者分論壇HarmonyOS學生公開課-OpenHarmony Codelabs開發(fā)案例

評論