共计 4958 个字符,预计需要花费 13 分钟才能阅读完成。
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 的音视频解决能力更弱小。
-
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
- 输出节点(MediaSourceFilter): 读取 MP3 原始数据,传给下一个节点。
- 解封装节点(DemuxerFilter): 解析 ID3 Metadata 容器头信息,作为后续节点的参数输出,并且把一帧帧 MP3 Frame(即 ES Data)传给后续的解码节点。
- 解码节点(AudioDecoderFilter): 把 ES Data 解码成 PCM 数据,传给输入节点。
- 输入节点(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<SourcePlugin> FileSourcePluginCreator(const std::string& name)
{return std::make_shared<FileSourcePlugin>(name);
}
Status FileSourceRegister(const std::shared_ptr<Register>& 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<MediaSource> source)
{return OpenFile(source->GetSourceUri());
}
// 实现 Read 接口,它会读取数据用于后续解决
Status Read(std::shared_ptr<Buffer>& buffer, size_t expectedLen)
{std::fread(bufData->GetWritableAddr(expectedLen), sizeof(char), expectedLen, fp_);
return Status::OK;
}
}
FileSource 插件的残缺代码可参考:
https://gitee.com/openharmony…
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…