OpenHarmony新增兩個(gè)分布式能力!快來(lái)了解~
分布式能力作為OpenHarmony操作系統的關(guān)鍵能力,一直備受關(guān)注,同時(shí)它也是開(kāi)源社區能力構建的重點(diǎn)。在3月底發(fā)布的OpenHarmony v3.1 Release版本中,媒體子系統新增了兩個(gè)分布式能力:分布式媒體庫和分布式相機。本期就帶大家一起來(lái)了解這兩個(gè)新增的分布式能力~
一、萬(wàn)物互聯(lián)帶給多媒體框架的挑戰如今我們在生活中已經(jīng)被越來(lái)越多的電子設備所包圍。這些設備有不同的功能(音箱、大屏、攝像頭、冰箱等)、不同的交互界面(語(yǔ)音、觸屏、紅外遙控等),給人們提供了足夠便利的同時(shí),卻給開(kāi)發(fā)者帶來(lái)了巨大的挑戰:
1. 設備的硬件和功能差異巨大。
這就導致了各產(chǎn)品應用間存在天然的隔離,要實(shí)現設備之間的多媒體互通互助也困難重重。如何屏蔽設備間的差異,提供相對一致的多媒體能力接口?
2. 隨著(zhù)各種外圍電子設備的增加,各設備間的連接網(wǎng)絡(luò )也變得更加復雜。
試想一下:當你需要在藍牙音箱上播放電視的音頻時(shí),你不得不用遙控器在電視的菜單中進(jìn)行繁瑣的設置;當你想將聲音切換到藍牙耳機時(shí),又不得不重新完成繁瑣的設置操作。這樣感覺(jué)是人在服務(wù)于這些設備,而不是設備服務(wù)于人。隨著(zhù)更多的電子設備進(jìn)入人們的生活,復雜的硬件環(huán)境帶給人們的復雜操作會(huì )越來(lái)越多。如何在人們需要的時(shí)候給出最佳的組網(wǎng)方式,并且能夠實(shí)現媒體數據傳輸的最佳路由?
3. 在全屋智能化的今天,“豐富的應用場(chǎng)景”層出不窮。
每個(gè)單一設備可能只有一個(gè)功能,比如:體脂秤、攝像頭、投影儀等,但是用戶(hù)的應用場(chǎng)景卻大多集合了多種功能。如何讓不同的設備組織起來(lái),共同給用戶(hù)提供一個(gè)完整的媒體功能?
如何解決上面這些問(wèn)題呢?這就需要構建一個(gè)天然支持分布式的操作系統。OpenHarmony在初始設計階段就將焦點(diǎn)放在如何實(shí)現分布式能力上面,這使它天然具備分布式特性,能夠輕松實(shí)現設備間的硬件互助、數據共享、服務(wù)遷移,同時(shí)使應用輕松接入分布式能力,給用戶(hù)提供順暢的跨設備交互體驗。
下面我們要介紹的兩個(gè)分布式能力——分布式媒體庫和分布式相機,分別用于支撐媒體庫和相機的分布式場(chǎng)景,為用戶(hù)提供跨設備的多媒體交互體驗。
二、分布式媒體庫下面從框架圖和API接口的使用兩個(gè)方面,為大家介紹分布式媒體庫。
1. 框架圖
分布式媒體庫的框架圖如下:
圖1 分布式媒體庫框架圖
分布式媒體庫主要由以下兩部分組成:
● MediaLibrary JS API:通過(guò)JS API接口向應用層提供媒體文件的管理和操作的能力。
● MediaLibraryDataAbility:通過(guò)SyncTable、RDB Utils、File Utils功能模塊,與媒體子系統外部的分布式數據庫和分布式文件系統交互,從而獲得對分布式數據的增刪改查能力。
2. API接口的使用
開(kāi)發(fā)者主要通過(guò)JS API接口來(lái)使用分布式媒體庫能力。下面通過(guò)兩個(gè)典型操作來(lái)講解如何使用分布式媒體庫的JS API接口:
(1)獲取設備的networkId
通過(guò)getActivePeers()接口可以獲取當前組網(wǎng)中所有可訪(fǎng)問(wèn)的設備。獲取到的PeerInfo信息中包含一個(gè)networkId參數,以此作為分布式數據庫訪(fǎng)問(wèn)的關(guān)鍵參數,來(lái)區分要訪(fǎng)問(wèn)的設備。
(2)使用networkId進(jìn)行數據操作
MediaFetchOptions提供對媒體庫進(jìn)行訪(fǎng)問(wèn)操作的參數集合,其中的networkId參數會(huì )跟隨MediaFetchOptions一起通過(guò)getFileAssets()接口下發(fā)給媒體庫服務(wù)接口,并且依此來(lái)訪(fǎng)問(wèn)對應設備上的數據。
更多的接口詳情,請從碼云OpenHarmony項目的媒體庫JS API聲明文件中獲取。
https://gitee.com/openharmony/interface_sdk-js/blob/master/api/@ohos.multimedia.mediaLibrary.d.ts
下面我們從系統相冊應用的實(shí)現代碼中抽取幾個(gè)關(guān)鍵的代碼段,看看應用訪(fǎng)問(wèn)分布式媒體庫的操作流程:
系統相冊應用的完整代碼及開(kāi)發(fā)說(shuō)明,從碼云OpenHarmony項目中獲取。
https://gitee.com/openharmony/applications_photos
三、分布式相機下面從框架圖和API接口的說(shuō)明兩個(gè)方面,為大家介紹分布式相機。
1. 框架圖
分布式相機的框架圖如下:
圖2 分布式相機框架圖
從圖2中可以看出,分布式相機框架(Distributed Hardware)分為主控端和被控端。設備B擁有本地相機設備,分布式組網(wǎng)中的設備A可以分布式調用設備B的相機設備。這種場(chǎng)景下,設備A是主控端,設備B是被控端,兩個(gè)設備通過(guò)軟總線(xiàn)進(jìn)行交互。VirtualCameraHAL作為硬件適配層(HAL)的一部分,負責和分布式相機框架中的主控端交互,將主控端CameraFramwork下發(fā)的指令傳輸給分布式相機框架的SourceMgr處理。SourceMgr則通過(guò)軟總線(xiàn)將控制信息傳遞給被控端的CameraClient,CameraClient直接通過(guò)調用被控端CameraFramwork的接口來(lái)完成對設備B相機的控制。從設備B反饋的預覽圖像數據會(huì )通過(guò)分布式相機框架的ChannelSink回傳到設備A的HAL層,進(jìn)而反饋給應用。通過(guò)這種方式,設備A的應用就可以像使用本地設備一樣使用設備B的相機。
2. API接口的使用
開(kāi)發(fā)者主要通過(guò)JS API接口來(lái)使用分布式相機能力。下面通過(guò)兩個(gè)典型操作來(lái)講解如何使用分布式相機的JS API接口:
(1)獲取可用的相機設備
通過(guò)getCameras()接口可以獲得當前組網(wǎng)中所有可用的相機設備(包括分布式相機設備)。在獲取到的Camera信息中,有兩個(gè)參數需要關(guān)注:
● cameraId:相機設備的唯一標識。
● connectionType:相機設備的連接類(lèi)型。當參數值為CAMERA_CONNECTION_REMOTE時(shí),表示此相機設備為分布式相機設備。
(說(shuō)明:在分布式相機的 JS API中,所有的接口都是本地相機設備和分布式相機設備共用的,接口通過(guò)參數cameraId來(lái)指定執行操作的相機設備。)
(2)創(chuàng )建相機設備輸入流
createCameraInput()接口為創(chuàng )建相機設備輸入流的接口,其中cameraId參數用于區分打開(kāi)哪個(gè)相機設備。如果傳入的是一個(gè)有效的分布式相機的cameraId,則自動(dòng)會(huì )觸發(fā)分布式相機特性。
更多的接口詳情,請從碼云OpenHarmony項目Camera JS API聲明文件中獲取。
https://gitee.com/openharmony/interface_sdk-js/blob/master/api/@ohos.multimedia.camera.d.ts
下面我們從系統相機應用的實(shí)現代碼中抽取幾個(gè)關(guān)鍵的代碼段,看看應用訪(fǎng)問(wèn)分布式相機的操作流程:
系統相機應用的完整代碼,請從從碼云OpenHarmony項目中獲取。
https://gitee.com/openharmony/applications_camera
四、結束語(yǔ)從開(kāi)放的代碼可以看出,當前構建的多媒體分布式能力還比較基礎,部分分布式能力接口也還沒(méi)有向三方應用開(kāi)放。我們會(huì )繼續努力,希望在下個(gè)版本上,分布式能力能擴展到音頻、播控等更多特性,為大家提供更加豐富的分布式多媒體體驗。
OpenHarmony,加油吧!
*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。