声网下一代视频引擎架构探索与实践

2021年11月25日 阅读数:6
这篇文章主要向大家介绍声网下一代视频引擎架构探索与实践,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

为应对愈发多样化的音视频互动场景下的挑战,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 使用率。

图片

最后,为了造成一个性能优化闭环反馈的通路,咱们实现了全链路的性能质量监控机制,对每个基础视频处理单元,都会统计和上报入帧和出帧的分辨率和和帧率,以及一些模块特有的数据。系统层面上对耗时较长的任务也有监控和上报,根据不一样问题调查的需求,咱们将这部分数据按需导入用户本地日志,并将体验相关的数据上报线上质量监控系统,达到对问题快速定位以及优化性能反馈的效果。

总结一下,在性能优越可监控方面,咱们首先优化了移动端数据处理链路,分离了控制面和数据面,提高了总体视频数据的传输效率。另外构建了视频处理特性相关的内存池来下降系统资源消耗。最后,实现了全链路视频质量监控机制,来对视频优化性能达到闭环反馈的效果。

实际上,咱们如今下一代视频处理引擎已经进入到了落地和打磨阶段。架构优越性在实践中也获得了验证,咱们如今就来看一下实际应用案例。

下一代视频引擎具备高度的灵活性和可扩展性。基于这个视频引擎,经过业务组合方式搭建了先后端统一的合图转码通用框架,基于这个框架基础上,咱们能够快速响应前端和后端的各种合图需求。好比在线视频相亲场景,这是典型的多人互动实时场景,传统一个嘉宾须要订阅红娘以及其余嘉宾视频流,对下行带宽和机器处理性能形成很大的压力,为了解决这个问题,咱们快速运用合图转码通用框架上线云端合图项目,在云端将各个嘉宾和红娘视频合成一路流再推送给观众。同时合图布局和背景图、嘉宾视频中断显示策略能够根据用户业务进行定制: 好比显示最后一帧、背景图、占位图等等。

一样的合图转码框架应用在本地的话,咱们实现了本地实时视频编辑混流的功能,能够用在电商直播等等领域当中,主播能够在本地将各类各样图源,好比多路摄像头,多路屏幕共享,媒体播放器和远端用户视频以及不一样的图片素材进行实时合流推送。

咱们分享就这些,谢谢你们!