openatom openharmony(以下简称“openharmony”)是由开放原子开源基金会(openatom foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代,基于开源的方式,搭建一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展。面对万物互联时代种类众多、且差异巨大的终端设备,我们为 openharmony 打造了一款新的音视频引擎——histreamer。
一、histreamer产生背景
数字多媒体技术在过去的数十年里得到了飞速的发展,音乐、电话、电视、电影、视频会议等等,伴随着我们度过每一天。为了给用户提供丰富的多媒体处理能力,业界已经有比较成熟的音视频引擎,比如开源的音视频引擎 gstreamer。为什么我们还要打造一款新的音视频引擎呢?
随着万物互联时代的到来,越来越多的智能化设备出现在我们的生活中。比如:智能冰箱可以通过屏幕和声音,告诉人们储藏的菜品快要过期了;智能闸机可以通过人脸识别,自动完成检票工作;智能门锁可以通过语音和视频,提升开锁的效率和安全性......
与pc、手机等标准(standard)设备不同,很多智能化设备的cpu处理能力比较弱、内存也比较小,传统的音视频引擎无法支持此类设备。histreamer 应运而生,既支持轻量级的 mini/small 设备,也支持 standard 设备(目前支持部分功能)。histreamer 在不断发展和完善中,未来将会支持 standard 设备的更多功能。
二、“管道+插件”,实现弹性部署
为了支持 mini/small/standard 设备,histreamer 采用管道(pipeline)和插件(plugin)的软件架构,从而可以根据设备的硬件和需求差异进行弹性部署。histreamer 把音视频处理的每个过程抽象成节点,上一个节点的输出,作为下一个节点的输入,把多个节点连接起来,整体形成一个管道(pipeline),完成音视频的数据读取、解封装、解码、输出的完整流程。同时,插件可以为 pipeline 的节点提供丰富的扩展功能,让 histeamer 的音视频处理能力更强大。 1. pipeline框架介绍
为了让大家理解 histreamer 的 pipeline 框架,下面以 mp3 音频播放为例讲解:
输入是一个 mp3 文件,输出是播放出的音乐,这中间经过了很多步骤。
先来看一下 mp3 文件结构:
图1 mp3文件结构 mp3 文件由 id3 metadata 容器头和若干 mp3 frame(mp3 数据帧)构成。每个 mp3 frame 又由 mp3 header(mp3 头信息)和 mp3 data 构成。这一系列的 mp3 frame 称为 es data( element stream data)。
● id3 metadata:容器头,主要包括标题、艺术家、专辑、音轨数量等。
● mp3 header:包含 mp3 sync word(标识 mp3 数据帧起始位置)和 mpeg 版本信息等。
● mp3 data:包含压缩的音频信息。
播放 mp3 文件,首先需要把 mp3 文件数据读进来,然后去掉 id3 metadata 容器头(即解封装),再把一系列 mp3 frame 解压缩成 pcm(pulse-code modulation)数据,最后驱动喇叭发声。这个过程按顺序可以抽象成如下四个节点:
图2 mp3音频播放的pipeline
1. 输入节点(mediasourcefilter): 读取 mp3 原始数据,传给下一个节点。
2. 解封装节点(demuxerfilter): 解析 id3 metadata 容器头信息,作为后续节点的参数输入,并且把一帧帧 mp3 frame(即 es data)传给后续的解码节点。
3. 解码节点(audiodecoderfilter): 把 es data 解码成 pcm 数据,传给输出节点。
4. 输出节点(audiosinkfilter): 输出 pcm 数据,驱动喇叭发声。
由以上示例可知,histreamer 通过 pipeline 框架把音视频处理的每个过程抽象成一个个节点。这些节点是解耦的,可以灵活拼装,从而可以根据业务需要拼装出不同的 pipeline。同时,为了使多个节点能更好地协同工作,histreamer 还支持节点间的参数自动协商。
2. histreamer插件介绍
了解了 histreamer 的 pipeline 框架后,我们再来看看 histreamer 插件。
histreamer 的 pipeline 框架的很多节点(比如输入节点、解封装节点、解码节点、输出节点等)都支持插件扩展。通过插件,节点的功能变得更加丰富、更加强大。
插件的应用场景非常广泛,比如:
● 媒体格式非常多,且以后还会有新的格式产生,可以通过插件支持新的媒体格式。
● 不同 os 平台或设备,处理方式存在差异,可以通过插件支持不同的处理方式。
● 不同类型的设备,需求不同,能提供的 cpu/rom/ram 资源多少也不同,也可以通过插件来支持。
3. 弹性部署
histreamer 基于管道(pipeline)和插件(plugin)的软件架构,可以根据设备的硬件和需求差异实现弹性部署。
图3 histreamer弹性部署
如图 3 所示,mini 设备(比如音箱),它的 cpu 处理能力很弱,rom/ram 资源很少,需要的功能也比较少,只需要音频播放功能。histreamer 可以配置成只支持音频播放,并且选择轻量级的插件,配置同步解码模式,减少资源消耗。而 small 设备,cpu 处理能力强一些,rom/ram 空间大一些,需要音频播放和视频播放功能。histreamer 可以配置成支持音视频播放,并且选择功能更强的插件。
三、histreamer逻辑架构
经过上面的介绍,我们了解了 histreamer 的“管道+插件”的软件架构。下面我们再来看看 histreamer 的详细的逻辑架构。
图4 histreamer逻辑架构图
histreamer 主要由 histreamer 引擎和 histreamer 插件构成。
其中,histreamer引擎又分为以下四层:
● 业务封装层:基于 pipeline 封装实现播放器、录音机功能,简化上层应用使用。
● pipeline 框架层:提供 pipeline 和若干个节点(输入、解封装、解码和输出)的实现,支持把多个节点连接在一起形成 pipeline。
● 插件管理层:用于插件生命周期管理,支持动态加载或静态链接两种方式使用插件。
● 工具库层:提供框架依赖的工具,隔离操作系统差异,提供调测功能。
histreamer 插件,则分为平台软件插件和厂商硬插件两类:
● 平台软件插件:由 openharmony 平台提供,可跨产品复用的软件算法插件。
● 厂商硬插件:由厂商提供的基于硬件加速的插件,如硬件加速的编解码插件。
应用开发者可以直接使用现成的插件来实现多媒体功能,节省大量的开发时间。插件越丰富,histreamer 的音视频处理能力会更强大。欢迎广大开发者参与 histreamer 插件的开发,一起来丰富 histreamer 插件!
四、histreamer插件开发及实例
下面就为大家介绍 histreamer 插件的开发过程及实例讲解,感兴趣的小伙伴们赶紧学起来,一起参与 histreamer 插件开发吧~
1. 插件的开发
histreamer 插件的开发主要分为插件定义和功能实现两个部分。
(1)插件定义
histreamer 插件是通过 plugin_definition 宏来定义的。以输入插件 filesource 为例,定义代码如下:
std::shared_ptr filesourceplugincreator(const std::string& name){ return std::make_shared(name);}status filesourceregister(const std::shared_ptr& reg){ sourceplugindef definition; definition.name = filesource; definition.description = file source; definition.rank = 100; // 100: max rank definition.protocol.emplace_back(protocoltype::file); definition.creator = filesourceplugincreator; return reg->addplugin(definition);}//plugin_definition传入四个参数plugin_definition(filesource, licensetype::apache_v2, filesourceregister, [] {});
使用 plugin_definition 宏定义插件(即上面最后一行代码)时,传入了四个参数:
a) 插件名称:即示例中的“filesource”。
b) license 信息:即示例中的“licensetype::apache_v2”。
c) 插件注册函数:即示例中的“filesourceregister”,该函数描述了插件基本信息,包括插件对象创建函数,并且还调用 addplugin 把插件注册到系统中。
d) 插件反注册函数:可以传为空实现。
(2)功能实现
实现插件功能时,需根据要实现的插件类型,继承对应插件接口类,并实现相关接口。比如实现输入插件 filesource,需要继承 sourceplugin,并实现 setsource、read 等接口,代码如下:
// 定义filesourceplugin类继承sourceplugin类class filesourceplugin : public sourceplugin {// 实现setsource接口, 设置要打开的文件路径status setsource(std::shared_ptr source) {return openfile(source->getsourceuri());}// 实现read接口,它会读取数据用于后续处理status read(std::shared_ptr& buffer, size_t expectedlen){std::fread(bufdata->getwritableaddr(expectedlen), sizeof(char), expectedlen, fp_);return status::ok;}}
filesource插件的完整代码可参考:
https://gitee.com/openharmony/multimedia_histreamer/tree/master/engine/plugin/plugins/source/file_source
2. 插件的部署
使用 plugin_definition 定义的 histreamer 插件,可以是单一功能的插件,也可以是有多个功能的插件包。每个这样的插件或插件包,可以独立编译成.a或者.so,分别对应以下两种部署方式:
● 静态部署:一般用在 mini 设备上,插件编译成静态库.a,链接到系统中。
● 动态部署:一般用在 small/standard 设备上,插件编译成动态库.so,放到系统指定目录下,动态加载运行。
3. 插件的运行
插件开发完成且部署到系统之后,histreamer 启动时就会自动完成插件的注册。下一步,就是运行插件了。
运行新实现的插件,需要先满足该插件的运行条件。比如:filesource 只会在播放本地文件时运行;mp3 解码插件只会在播放 mp3 文件时运行......
开发者可以通过日志信息,查看是否运行了自己的插件。如果有别的插件注册到系统中,导致自己的插件无法运行时,可以卸载引起干扰的插件。卸载动态部署的插件,删除对应的.so即可;卸载静态部署的插件,需要修改编译脚本取消对应插件的编译。
五、结束语
openharmony 欢迎广大开发者一起加入 histreamer 插件开发,扩展自己想要的媒体功能,共同丰富 histreamer 媒体生态!
同时,预告大家:histreamer 的下一个版本将为 standard 设备增强更多功能,敬请期待!
本期关于 histreamer 的介绍就到这里了。
更多histreamer信息,请参考:
https://gitee.com/openharmony/multimedia_histreamerhttps://gitee.com/openharmony/multimedia_histreamerhttps://gitee.com/openharmony/multimedia_histreamer
以领先的电表参考设计方案推进电网智能化发展
北京现共享男友!共享男友明码标价!网友热评:平时免费都没人要,现在还想收费?
CNC 加速实现步进电机技术
基于MEMS的固定腔法布里-珀罗(F-P)干涉仪实现长波红外光谱传感
沐曦与未来速度完成兼容性测试
OpenHarmony打造了一款新的音视频引擎——HiStreamer
2020年将会有哪些新的数据中心诞生
我国海上风电嵌岩单桩最大直径纪录刷新 又迎来一里程碑式进展
Daqri为专业船舶配AR智能眼镜,现已开始出货
5G物联网即将引爆哪些市场?
太阳能电池板自动对光控制集成电路的关键技术研究
数码相机电池如何省电?
沃尔沃XC60改怡然吸风式座椅通风功能
NVIDIA旗舰级显卡RTX3090将配12针转用电源接口,成最强电表
驱动容性负载时,为什么输出端增加串联电阻,可以提升稳定性?
双头应急灯个工作原理和电路图详解
看完这六条 让你买华为P10 P10plus不后悔
期货合约存在哪一些风险
解密数字化制造:离散与流程制造MES/MOM业务与功能需求分析
计算机视觉落地企业及计算机视觉应用前景