本专栏将分享阿里云视频云MediaBox系列技术文章,深度剖析音视频开发利器的技术架构、技术性能、开发能效和最佳实践,一起开启音视频的开发之旅。本文为MediaBox技术架构篇,重点从音视频终端SDK的技术架构、优化设计、架构优势等方面,介绍MediaBox SDKs如何实现技术架构升级。
善师|作者
流媒体时代,越来越多的企业,投入到短视频、直播、音视频通话等相关的业务研发中来,特别是手机移动端,作为用户流量的主要入口,成为愈发激烈的流媒体竞争战场。
在此浪潮下,众多App厂商纷纷涌入音视频赛道,并且往往接入不止一个音视频业务,可能涉及直播、播放器、音视频通话等多项音视频服务。
过去,厂商在接入多个音视频业务时,通常需要接入多个音视频SDK,带来的结果是包体积极速增大,同时接入效率低下,无法做到快速上线,从而导致在竞争中错失先机。
MediaBox音视频终端SDK正是为了解决企业这一痛点而生的。
01 概念说明
MediaBox音视频终端SDK(MediaBox SDKs),以统一的技术底座,形成一系列不同能力的SDK,为客户提供灵活、易用、高效的接入体验。音视频终端SDK,与音视频低代码开发AUI Kits,以及基于行业生态合作构建的音视频场景方案,共同组成了MediaBox音视频终端一体化套件大图。
从业务维度划分,MediaBox SDKs是阿里云视频云基础终端能力的集合,包含了播放器、直播、超低延迟直播、实时音视频通信、短视频创作等音视频服务能力。
从技术能力划分,音视频终端SDK提供音视频采集、前处理、音视频编码、封装/解封装、媒体网络传输、音视频解码、后处理、音视频渲染等各项技术能力。
02 技术架构
为了构建一个高性能、高可用、高灵活性、可插拔、易扩展性的SDK,我们将SDK的媒体引擎分为微内核、媒体组件和端基础能力组件三个部分。
微内核:作为业务SDK的核心和控制中枢,负责串联和管理各个媒体组件,形成业务的pipeline,主要由消息中心、调度中心、链接管理、队列管理、组件管理、插件管理和监控中心几个部分组成。
媒体组件:音视频媒体处理的基本能力单元,由音视频采集、前后处理、音视频编解码、文件封装解封装,媒体网络输出以及媒体渲染等部分组成。
端基础能力:端侧高可用配套基础能力,提供License、配置下发、异常管理、埋点等多种端侧能力。
03 优化设计
通常,音视频端侧SDK没有统一的内核、组件,每个SDK都是独立的业务开发,不存在功能复用,这就无法对组件进行统一迭代优化,而是需要对不同SDK分别进行性能、功能优化,或者进行兼容性适配,从而导致无法快速应用到业务上。
对此,阿里云视频云MediaBox对终端SDK的内核、组件进行优化设计,实现高性能、高稳定、高可用的架构升级:
• 微内核设计,将所有业务基于统一的微内核进行重构;
• 综合所有SDK的组件,统一抽离、沉淀媒体组件,保证所有组件能力一致、行为一致、性能稳定;
• 统一所有端侧基础能力,对SDK业务统一授权,增加端侧排障和异常预警能力,保证高可用。
1、微内核设计
在综合考虑各个SDK原本的引擎层设计之后,我们基于原有的业务模式,设计了一套可用于所有音视频SDK的微内核。
为了实现高性能和高稳定性,确保内核简单好用,且不对业务造成损伤,我们采用的微内核设计由以下几部分组成:
• 消息中心:负责各个业务组件间的消息分发;
• 调度中心:负责各个业务组件运行任务的线程调度;
• 链接管理:负责管理媒体引擎各个业务组件间的链接关系;
• 队列管理:消息队列管理,配合调度中心,管理当前的任务队列;
• 组件管理:负责管理业务的所有组件,负责注册、反注册组件;
• 监控管理:对组件的数据处理进行监控,及时发现消息处理或者数据处理的异常;
• 插件管理:预埋了插件化设计,方便定制插件,扩展能力。
2、组件抽离和复用
我们对视频云终端SDK用到的媒体组件进行组件化管理,统一抽离、复用以及统一优化迭代。各个音视频SDK中的组件分布情况如图所示:
以直播场景和短视频拍摄场景下的业务Pipeline为例,展示各组件的串联效果:
直播场景下的业务Pipeline
短视频拍摄场景下的业务Pipeline
3、组件开发设计
在应用端开发过程中,研发同学往往会将一个功能复杂的库,分割为若干个功能责职单一的小组件,并通过Maven(Android)或者 Cocoapod(iOS)进行组件的管理。然后Gradle 和Xcode 会自动梳理组件间的依赖关系,让业务同学不用关心各个组件,只需关心业务本身即可。
但是,视频云终端SDK,构建的目标产物是SDK,而不是App。因此,我们在面对SDK这种跨多平台终端时,需要对多平台代码进行管理,功能组件代码分布为:C++代码(主要代码)、object-c代码(iOS)、Java代码(Android)以及 WebAssembly。截止到目前为止,还没有一款好的工具,具备管理混合代码能力,满足多个平台的开发需求。
为此,我们参考CPM,Java Maven,Cocoapod以及Npm等包管理方案,为MediaBox终端SDK量身定制了一套具备多平台的组件管理和依赖的解决方案,通过可调试、高效编译、依赖冲突预警等能力,使得组件可以大规模复用,并实现统一版本迭代。
* 针对不同平台的组件做同一的组件化使用管理,后续会有ACPM组件的专项文章介绍,敬请期待。
4、统一基础能力建设
除了媒体处理部分的统一外,基础能力也进行了整合和统一。比如License管理,以前,每个SDK都有自己的License管理,客户使用时,需要在不同的地方开通授权,而我们增加统一授权后,客户只需通过统一的控制台申请授权,并下载对应类型的MediaBox音视频终端SDK即可。
1)统一授权
2)统一崩溃捕获
通过崩溃捕获的能力,可以捕捉到我们SDK的异常(非我们SDK的不捕获),并第一时间进行分析和修复,打造高稳定性的SDK。
除此之外,我们还增加了线上异常预警、配置下发及埋点能力,针对客户突发异常或者线上兼容性问题实现排障和适配。
04 架构优势
经过音视频终端SDK架构的优化设计后,我们实现了MediaBox一个内核、多个业务引擎,统一的媒体组件和完整的端侧基础能力建设。主要成果如下:
• 高复用率。端侧媒体组件全复用,代码复用率高达80%,整体SDK包大小下降60%;
• 高可靠性。经过几个版本的迭代,MediaBox SDK的线上稳定性提升,SDK崩溃下降至十万之一;
• 高灵活性。MediaBox SDK可以满足客户各种业务的组合能力,比如直播和播放器的组合,直播和实时音视频的组合,更灵活地满足客户的需求;
• 高性能。通过统一的微内核,统一监管性能指标,内存和CPU占用都有所下降。
基于这样的技术架构,MediaBox将分散的各个SDK,组合成全功能统一出包,并最终组建成视频云MediaBox SDKs产品大家族。
了解更多音视频终端SDK产品信息,欢迎加入官方答疑钉钉群咨询交流:https://qr.dingtalk.com/action/joingroup?code=v1,k1,406j3FqsuYc34fJsJ5MLL+bq6HdzZUbKjY3JeD++AEc=&_dt_no_comment=1&origin=11