分布式能力作为OpenHarmony操作系统的关键能力,一直备受关注,同时它也是开源社区能力构建的重点。在3月底发布的OpenHarmony v3.1 Release版本中,媒体子系统新增了两个分布式能力:分布式媒体库和分布式相机。本期就带大家一起来了解这两个新增的分布式能力~
一、万物互联带给多媒体框架的挑战
如今我们在生活中已经被越来越多的电子设备所包围。这些设备有不同的功能(音箱、大屏、摄像头、冰箱等)、不同的交互界面(语音、触屏、红外遥控等),给人们提供了足够便利的同时,却给开发者带来了巨大的挑战:
1. 设备的硬件和功能差异巨大。
这就导致了各产品应用间存在天然的隔离,要实现设备之间的多媒体互通互助也困难重重。如何屏蔽设备间的差异,提供相对一致的多媒体能力接口?
2. 随着各种外围电子设备的增加,各设备间的连接网络也变得更加复杂。
试想一下:当你需要在蓝牙音箱上播放电视的音频时,你不得不用遥控器在电视的菜单中进行繁琐的设置;当你想将声音切换到蓝牙耳机时,又不得不重新完成繁琐的设置操作。这样感觉是人在服务于这些设备,而不是设备服务于人。随着更多的电子设备进入人们的生活,复杂的硬件环境带给人们的复杂操作会越来越多。如何在人们需要的时候给出最佳的组网方式,并且能够实现媒体数据传输的最佳路由?
3. 在全屋智能化的今天,“丰富的应用场景”层出不穷。
每个单一设备可能只有一个功能,比如:体脂秤、摄像头、投影仪等,但是用户的应用场景却大多集合了多种功能。如何让不同的设备组织起来,共同给用户提供一个完整的媒体功能?
如何解决上面这些问题呢?这就需要构建一个天然支持分布式的操作系统。OpenHarmony在初始设计阶段就将焦点放在如何实现分布式能力上面,这使它天然具备分布式特性,能够轻松实现设备间的硬件互助、数据共享、服务迁移,同时使应用轻松接入分布式能力,给用户提供顺畅的跨设备交互体验。
下面我们要介绍的两个分布式能力——分布式媒体库和分布式相机,分别用于支撑媒体库和相机的分布式场景,为用户提供跨设备的多媒体交互体验。
二、分布式媒体库
下面从框架图和API接口的使用两个方面,为大家介绍分布式媒体库。
1. 框架图
分布式媒体库的框架图如下:
图1 分布式媒体库框架图
分布式媒体库主要由以下两部分组成:
● MediaLibrary JS API:通过JS API接口向应用层提供媒体文件的管理和操作的能力。
● MediaLibraryDataAbility:通过SyncTable、RDB Utils、File Utils功能模块,与媒体子系统外部的分布式数据库和分布式文件系统交互,从而获得对分布式数据的增删改查能力。
2. API接口的使用
开发者主要通过JS API接口来使用分布式媒体库能力。下面通过两个典型操作来讲解如何使用分布式媒体库的JS API接口:
(1)获取设备的networkId
通过getActivePeers()接口可以获取当前组网中所有可访问的设备。获取到的PeerInfo信息中包含一个networkId参数,以此作为分布式数据库访问的关键参数,来区分要访问的设备。
(2)使用networkId进行数据操作
MediaFetchOptions提供对媒体库进行访问操作的参数集合,其中的networkId参数会跟随MediaFetchOptions一起通过getFileAssets()接口下发给媒体库服务接口,并且依此来访问对应设备上的数据。
更多的接口详情,请从码云OpenHarmony项目的媒体库JS API声明文件中获取。
https://gitee.com/openharmony/interface_sdk-js/blob/master/api/@ohos.multimedia.mediaLibrary.d.ts
下面我们从系统相册应用的实现代码中抽取几个关键的代码段,看看应用访问分布式媒体库的操作流程:
系统相册应用的完整代码及开发说明,从码云OpenHarmony项目中获取。
https://gitee.com/openharmony/applications_photos
三、分布式相机
下面从框架图和API接口的说明两个方面,为大家介绍分布式相机。
1. 框架图
分布式相机的框架图如下:
图2 分布式相机框架图
从图2中可以看出,分布式相机框架(Distributed Hardware)分为主控端和被控端。设备B拥有本地相机设备,分布式组网中的设备A可以分布式调用设备B的相机设备。这种场景下,设备A是主控端,设备B是被控端,两个设备通过软总线进行交互。VirtualCameraHAL作为硬件适配层(HAL)的一部分,负责和分布式相机框架中的主控端交互,将主控端CameraFramwork下发的指令传输给分布式相机框架的SourceMgr处理。SourceMgr则通过软总线将控制信息传递给被控端的CameraClient,CameraClient直接通过调用被控端CameraFramwork的接口来完成对设备B相机的控制。从设备B反馈的预览图像数据会通过分布式相机框架的ChannelSink回传到设备A的HAL层,进而反馈给应用。通过这种方式,设备A的应用就可以像使用本地设备一样使用设备B的相机。
2. API接口的使用
开发者主要通过JS API接口来使用分布式相机能力。下面通过两个典型操作来讲解如何使用分布式相机的JS API接口:
(1)获取可用的相机设备
通过getCameras()接口可以获得当前组网中所有可用的相机设备(包括分布式相机设备)。在获取到的Camera信息中,有两个参数需要关注:
● cameraId:相机设备的唯一标识。
● connectionType:相机设备的连接类型。当参数值为CAMERA_CONNECTION_REMOTE时,表示此相机设备为分布式相机设备。
(说明:在分布式相机的 JS API中,所有的接口都是本地相机设备和分布式相机设备共用的,接口通过参数cameraId来指定执行操作的相机设备。)
(2)创建相机设备输入流
createCameraInput()接口为创建相机设备输入流的接口,其中cameraId参数用于区分打开哪个相机设备。如果传入的是一个有效的分布式相机的cameraId,则自动会触发分布式相机特性。
更多的接口详情,请从码云OpenHarmony项目Camera JS API声明文件中获取。
https://gitee.com/openharmony/interface_sdk-js/blob/master/api/@ohos.multimedia.camera.d.ts
下面我们从系统相机应用的实现代码中抽取几个关键的代码段,看看应用访问分布式相机的操作流程:
系统相机应用的完整代码,请从从码云OpenHarmony项目中获取。
https://gitee.com/openharmony/applications_camera
四、结束语
从开放的代码可以看出,当前构建的多媒体分布式能力还比较基础,部分分布式能力接口也还没有向三方应用开放。我们会继续努力,希望在下个版本上,分布式能力能扩展到音频、播控等更多特性,为大家提供更加丰富的分布式多媒体体验。