为应答愈发多样化的音视频互动场景下的挑战,Agora 开始设计本人的下一代视频解决引擎,在过程中对于引擎架构、性能调优、插件零碎设计等方面总结了很多教训,心愿与各位音视频畛域的爱好者、行业从业者分享。
5 月 26 日下午,QCon 寰球软件开发大会「实时音视频专场」流动中,声网 Agora 架构师李雅琪带来了以《声网下一代视频解决引擎》为主题的大量干货分享,本文是对分享内容的整顿。
明天的分享次要会分三局部来进行:
一,为什么咱们要打造下一代视频解决引擎,以及引擎的设计准则和指标是什么;
二,咱们是如何达到设计准则和指标的;
三,下一代视频引擎的理论落地成果如何。
01 下一代视频解决引擎的设计指标
随着音视频技术疾速倒退,实时音视频互动在各种各样的畛域,如社交娱乐、在线直播、医疗中都失去了宽泛的利用和倒退。疫情以来,越来越多的场景迁徙到线上,不少读者可能也都有观看直播带货,或是陪小孩加入在线教育的经验。
那么这两个场景中会有哪些痛点呢?在视频直播场景中,解决多路视频源的需要越来越宽泛。比方电商直播场景中,主播通常须要应用多个机位进行多角度拍摄,以达到更好的带货成果。这类直播可能还会同步搭配应用导播台,在多个视频源中进行多种实时直播组合和无缝切换。
而对于在线教育场景来说,比拟传统的形式是摄像头拍摄老师,老师进行屏幕分享。为了丰盛在线教育的伎俩,咱们还能够减少一路视频拍摄,拍摄老师在手写板上的书写,甚至额定减少一个性能,反对老师播放本地课件或者在线课件。
在多路视频源的根底上,还会衍生进去对多路视频源的实时编辑和合图的需要。在直播助手的利用场景中,主播可能须要对多路视频源的采集进行实时合图和编辑,再增加本地素材和动静表情包来丰盛直播成果,同时升高上行带宽压力。在多人互动场景中,为了升高接收端的带宽压力和性能损耗,须要在云端将多路主播视频合成一路流再发送给各个接收端。
随着 AI 技术在图像处理的疾速倒退,交融 AI 算法的高级视频前解决性能也失去越来越多的利用,诸如一些高级美颜性能、背景宰割、背景替换。联合这三个场景咱们能够看到,下一代视频引擎的灵便可扩大能力被提出了更高的要求。
另外,随着咱们公司业务和团队规模的一直增长,下一代视频引擎的用户体量也在剧增,不同用户对集成开发的需要也各异。对于研发团队规模较小的开发者或集体开发者,他们须要的是引擎的集成繁难度,低代码量,疾速上线。而对于企业业务中台的开发者,会要求引擎凋谢更多的根底视频解决性能,从而能够定制化的实现视频解决业务。
面向各开发者群体的需要,声网的下一代视频解决引擎须要一个有弹性的设计来满足差异化的集成需要。
不仅是弹性的设计,视频直播体验也是很重要的指标。随着 5G 时代的到来,网络基础设施足够反对用户对更清晰更晦涩直播的体验需要,下一代 SDK 必须在性能优化方面做到极致,反对更高的视频分辨率,更高的帧率。思考到实时互动业务场景一直扩大,用户散布也越来越广,为了在网络基础设施较弱的国家和地区、性能较差的低端机型上,引擎都能够提供比拟好的视频直播体验,咱们就要撑持更好的弱网抗性,并优化性能资源耗费。
联合下面提到的场景丰富性、用户差异性,以及对视频直播体验的需要。咱们将下一代视频解决引擎设计准则和指标能够总结为四个方面:
1. 满足不同的用户对集成的差异化需要;
2. 灵便可扩大,可疾速撑持各种新业务和新技术场景落地;
3. 视频解决引擎的外围零碎要提供丰盛弱小的性能,升高开发人员的心智累赘,做到疾速牢靠;
4. 性能优越可监控,须要继续优化视频直播解决引擎性能,同时进步监控伎俩,造成闭环并一直迭代优化引擎的解决性能。
接下来咱们进入第二局部,针对下面所提到的四个设计指标,声网具体采纳了哪些软件设计的办法来进行施行落地。
02 下一代视频解决引擎的架构设计
后面提到的第一个设计指标,咱们要满足不同用户差异化的集成需要:引擎的使用者是人造分层的,一部分使用者谋求低代码疾速上线,须要引擎尽可能提供贴近他业务的性能;另外一部分用户,须要咱们提供更多的外围视频根底能力,在这之上客户能够依照本人的须要定制视频解决业务。
依据这个用户状态咱们的架构也采取分层业务设计,分成 High Level 和 Low Level。Low level 局部是面向视频解决外围性能进行建模,形象出了视频源处理单元,前 / 后处理单元、渲染器单元、编解码器单元、外围基础设施单元等。通过这些根底模块的组合和开发,在 Low level 的根底上,咱们又形象出面向客户业务的视频源 Track 的概念,网络视频流 Stream 的概念和场景的概念,在这下面封装了更贴近用户业务的 High Level API。
咱们来通过理论例子看一下 High Level 和 Low Level 两者在应用上的差异:假如当初要实现一个非常简单的场景,关上本地摄像头开启预览,公布到远端。
如果应用 High Level API,能够只通过 2 个简略 API 的调用,实现这个实时互动业务场景的搭建。首先通过 StartPreview API 开启本地摄像头并预览,而后通过 JoinChannel API 退出频道并公布视频流。若用户想在这一简略场景上实现更多定制业务性能,就能够应用 Low Level API。首先创立本地相机采集管线 CreateCameraTrack,这个 Track 提供了多种多样进行状态组建和状态管制的接口。同时咱们将本地媒体解决和网络公布节点进行理解耦,视频流能够公布到声网自研的 RTC 零碎中去或公布到 CDN 网络。
通过下面的例子能够看出。为了满足用户差异化需要咱们采纳了分层设计,High Level 面向业务提供易用性,Low Level 提供外围性能和灵活性。
咱们看第二个指标,灵便可扩大这一点咱们是如何做到的呢?在这之前我简略介绍一下对于视频解决当中的基本概念,视频解决的过程是以视频帧作为视频数据的载体。以本地发送解决流程为例,视频数据被采集之后会通过一系列的前处理单元,而后送到编码器单元进行压缩编码,最初依据不同网络协议通过封装之后发送到远端网络。接管的解决流程是从网络当中接管到视频流后进行解封装操作,送到解码器当中,通过一系列后处理单元后,再到渲染器进行展现。
咱们把以视频帧为数据载体的序列化视频解决 称为视频解决管线,每一个视频处理单元咱们把它称为一个模块。每个具体的视频处理单元能够有不同的实现,比如说视频源模块,能够是自采集的视频源,能够是摄像头采集的视频源或者屏幕共享的视频源。不同编码器依据编码标准和编码器实现也是能够有不同的扩大性能。网络发送节点能够依据不同协定发送到自研的 RTC 网络或者 CDN。不同的视频业务其实是根底视频处理单元依据业务灵便编排造成的。咱们心愿能够把灵便编排的能力作为咱们视频解决引擎的根底能力凋谢给到开发者,这样开发者就能够通过灵便自在的 API 组合,搭建满足本人业务需要的解决管线。
为了做到这一点,咱们的视频解决引擎外围架构是采纳了 Microkernel Architecture 的架构,拆散了整个引擎的变量和不变量。如图所示分两个局部,两头的 Core System 和外围的 Pluggable modules。两头黄色的局部是整个的外围零碎局部,对应着整个下一代视频解决引擎的不变量。在外围零碎中,咱们形象进去了各个根底视频处理单元的模块,以及提供了对立的管制面和数据面的接口。同时,引擎还提供了对这些根底视频模块进行组装和灵便编排的管制接口。此外,外围零碎还提供了一系列基础设施性能,比方跟视频解决相干的视频数据格式转换,根底的视频解决算法,针对视频解决特色进行内存治理优化的内存池以及线程模型,日志零碎和音讯总线等。
利用外围零碎底层能力,各个模块能够不便地进行业务扩大,比方说视频源模块,能够有推流模式视频源模块,也能够反对拉流模式的视频源模块,甚至反对一种非凡的视频源,即在转码的过程咱们能够把远端用户的视频解码后的视频帧作为新的视频源退出到本地发送的管线当中去。前解决模块和后处理模块也能够扩大出各种各样的实现,如根底的裁减缩放性能、美颜、水印性能等。编解码模块更为简单,一方面要反对多种编码标准,还有相应多种实现,软硬编等。同时,编解码抉择还是一个比较复杂的动静决策过程,咱们在编解码根底模块当中内置了依据能力协商、机型和实时视频编码品质进行动静抉择切换的编码器抉择策略。
接下来,结合实际使用场景看咱们如何灵便的搭建视频解决管线满足不同的业务组合场景。回到在线教育场景当中,假如当初在一个简单的在线教育场景当中,须要一个摄像头拍摄老师黑板书写,再有一路摄像头拍摄老师的人像,同时老师会通过屏幕共享进行课件分享,或者应用媒体播放器来播放本地或者在线的多媒体视频文件。一些高级场景当中,老师为了更好的直播成果,会开启背景宰割和背景替换模式,把老师的头像和课件叠加在一起,达到更好的成果。老师还能够在本地开启录制性能,将本人直播上课的视频录制到本地。
针对简单的组合利用都能够通过管线搭建来实现,上图是一个本地解决管线的概念图,对于方才所说的拍摄黑板,老师人像和课件分享,咱们能够通过动静替换采集源模块的具体实现来做。背景宰割是非凡的前解决模块,能够将老师头像实时剖析进去,而后再叠加到屏幕共享的采集源上。本地录制是一种非凡状态的渲染器模块,它是将本地视频帧依照文件格式封装、存储到本地门路当中,咱们将整个媒体解决和最初网络发送进行解耦,它能够动静抉择是推送到咱们的 RTC 网络中还是推送到 CDN。
接下来看一个接管管线组合利用的场景,咱们后盾有一个后盾媒体解决核心,能够依据用户业务处理器需要去进行实时的流媒体解决服务,其中包含云录制(对接管到的视频进行转储)云端进行视频鉴黄,低码高清解决,合图转码服务等。还有 Cloud Player 性能,将远端视频拉取下来之后推到 RTC 频道当中去。以及旁路推流,能够在咱们 RTC 网络当中将接管到的视频流转推到 CDN 当中去。
那接下来咱们看一下是如何通过搭建接管管线来满足不同使用场景的。
首先是咱们网络接管源的模块,它能够通过动静切换来接管来自 RTN 网络或者 CDN 的视频流。通过解码器模块之后送到一系列后处理模块当中去,包含方才提到的鉴黄模块、低码高清后处理模块等等。接管的渲染器模块的数量和地位都是能够灵便定制的,比方方才云录制的性能,它实际上就是一个非凡的渲染器模块。
方才介绍的是咱们通过微内核式架构设计实现了灵便扩大指标,各个模块性能能够疾速扩大的。视频解决管线也能够通过搭积木式的组合来实现业务的灵便编排。接下来咱们看一下疾速牢靠这个指标,咱们是想说 咱们外围零碎要提供丰盛且稳固的性能,在这根底上能够极大升高开发工作人员的心智累赘,晋升研发效力。
介绍这个之前,咱们先想一个问题,如果咱们没有一个稳固牢靠的外围零碎,一个开发人员要从零开始在咱们的管线上开发一个美颜插件,须要思考哪些问题。
首先毫无疑问是要开发美颜自身的业务逻辑。除此之外,在跟管线集成的时候,首先要思考模块在管线当中是否能够加载到正确的地位,前序解决模块对它有哪些影响,以及它的业务模块对后续性能产生哪些影响。
第二是数据格式问题,当管线上流转的数据格式不是美颜模块须要用到的格局的时候,它要对数据格式进行转换,这个数据转换算法实现的业务逻辑也须要模块的开发者来实现。
接下来是和管线集成过程当中,它须要理解整个管线的线程模型和内存管理模式。在配合管线的状态切换当中,美颜模块本身也要实现相应的状态管制的业务逻辑。同时,在一个管线当中,如果后续节点依据视频品质对前序节点有反馈的话,譬如后续节点说你须要调节你的吞吐量,它也须要有一种机制来接管和解决后续模块反馈的音讯。同时,当美颜插件运行的时候,有一些音讯告诉要发送给用户的话,就须要设计一套音讯告诉机制。
因为美颜插件是集成到提供了外围性能的 SDK 当中,插件的开发就会变得特地简略,插件作者只有依照外围零碎的接口协议的约定去实现相干的接口即可,外围零碎会主动依据它的性能以及从全局性能优化的角度,把它加载到正确的地位,那咱们 SDK 的使用者就能够应用这个插件了。
总结一下,对于疾速牢靠这一块实现了丰盛弱小的外围零碎性能,能够极大升高模块开发者的心智累赘,从而晋升研发效力。
最初,咱们来看一下性能优越可监控这一块,首先咱们对整个视频解决管线在挪动端上数据传递效率进行优化,实现了对挪动端原生数据格式全链路反对,包含采集模块、渲染模块、前解决模块,应用硬件的状况下能够实现整个解决链路的零拷贝,同时依据各个模块解决个性协商,能够把相应模块在管线上的地位进行优化,缩小 CPU 和 GPU 逾越,从而更好的进步数据传输效率。
另外,咱们在方才也提到了通过根底视频处理单元,将管制面和数据面进行了肯定拆散,这样有肯定的益处,比方用户对模块管制能够失去及时的响应,对于摄像机这类设施操作,是属于比拟重的操作。当用户频繁切换前置后置摄像头时,这类操作会阻塞用户 UI 造成较大延时。通过进行管制面和数据面的拆散,咱们能够在保障最初状态正确性的前提下实现疾速响应的相机操作。并让管制门路不再阻塞数据流转。同时管制门路能够不阻塞数据流转,咱们能够做到对本地图源进行实时编辑和发送。
升高系统资源耗费方面,咱们构建了实用于视频数据存储格局的内存池,反对多种视频格式的帧间内存复用,同时,能够依据零碎内存应用状况和管线负载状况、动静调整达到动态平衡的状态,这样能够缩小频繁的内存调配和开释,从而升高 CPU 使用率。
最初,为了造成一个性能优化闭环反馈的通路,咱们实现了全链路的性能品质监控机制,对每一个根底视频处理单元,都会统计和上报入帧和出帧的分辨率和和帧率,以及一些模块特有的数据。零碎层面上对耗时较长的工作也有监控和上报,依据不同问题考察的需要,咱们将这部分数据按需导入用户本地日志,并将体验相干的数据上报线上品质监控零碎,达到对问题疾速定位以及优化性能反馈的成果。
总结一下,在性能优越可监控方面,咱们首先优化了挪动端数据处理链路,拆散了管制面和数据面,晋升了整体视频数据的传输效率。另外构建了视频解决个性相干的内存池来升高系统资源耗费。最初,实现了全链路视频品质监控机制,来对视频优化性能达到闭环反馈的成果。
实际上,咱们当初下一代视频解决引擎曾经进入到了落地和打磨阶段。架构优越性在实践中也失去了验证,咱们当初就来看一下理论利用案例。
下一代视频引擎具备高度的灵活性和可扩展性。基于这个视频引擎,通过业务组合形式搭建了前后端对立的合图转码通用框架,基于这个框架根底上,咱们能够疾速响应前端和后端的各类合图需要。比方在线视频相亲场景,这是典型的多人互动实时场景,传统一个嘉宾须要订阅红娘以及其余嘉宾视频流,对上行带宽和机器解决性能造成很大的压力,为了解决这个问题,咱们疾速使用合图转码通用框架上线云端合图我的项目,在云端将各个嘉宾和红娘视频合成一路流再推送给观众。同时合图布局和背景图、嘉宾视频中断显示策略能够依据用户业务进行定制: 比方显示最初一帧、背景图、占位图等等。
同样的合图转码框架利用在本地的话,咱们实现了本地实时视频编辑混流的性能,能够用在电商直播等等畛域当中,主播能够在本地将各种各样图源,比方多路摄像头,多路屏幕共享,媒体播放器和远端用户视频以及不同的图片素材进行实时合流推送。
咱们分享就这些,谢谢大家!