分布式能力作为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,加油吧!
(免责声明:本网站内容主要来自原创、合作伙伴供稿和第三方自媒体作者投稿,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,读者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
任何单位或个人认为本网站中的网页或链接内容可能涉嫌侵犯其知识产权或存在不实内容时,应及时向本网站提出书面权利通知或不实情况说明,并提供身份证明、权属证明及详细侵权或不实情况证明。本网站在收到上述法律文件后,将会依法尽快联系相关文章源头核实,沟通删除相关内容或断开相关链接。 )