写点什么

OpenHarmony 新增两个分布式能力!快来了解~

作者:科技汇
  • 2022 年 4 月 28 日
  • 本文字数:2539 字

    阅读完需:约 8 分钟

分布式能力作为 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

四、结束语

从开放的代码可以看出,当前构建的多媒体分布式能力还比较基础,部分分布式能力接口也还没有向三方应用开放。我们会继续努力,希望在下个版本上,分布式能力能扩展到音频、播控等更多特性,为大家提供更加丰富的分布式多媒体体验。

OpenHarmony,加油吧!

用户头像

科技汇

关注

还未添加个人签名 2021.04.17 加入

还未添加个人简介

评论

发布
暂无评论
OpenHarmony新增两个分布式能力!快来了解~_科技汇_InfoQ写作社区