软件资讯

直播美颜技术大揭秘!

发布时间:2020-03-19 10:33
在当前直播和短视频领域,各家公司为了吸引用户和提升用户体验都在创新各种视频玩法,例如美颜、美妆、虚拟形象等。这些酷炫的效果背后其实是强大的渲染技术。
直播盒子
引擎规划
1. 引擎特色
前面说了咱们的方针是开发一个跨渠道、可扩展、高功能的烘托引擎。怎样理解?下面具体阐述一下:
1)跨渠道。咱们的直播盒子事务场景涵盖了移动端和PC端。为了进步开发功率,咱们要把渠道无关的逻辑笼统成公共组件,例如烘托管线、后处理算法等,完成一份代码,多端共用。
2)可扩展。跨渠道解决了横向的渠道差异问题,而可扩展便是解决事务迭代的纵向问题。咱们将烘托逻辑分解成一个一个的小“零件”,事务方能够像搭积木相同自由组合这些“零件”,而算法同学也能够很简略的造“零件”。这样事务迭代就简化成了简略的加减法,功率大大提高。
3)高功能。音视频烘托,尤其是视频烘托,是很消耗核算资源的。在端侧有限的核算资源前提下,还要能完成快速、高质量的烘托作用,就需求咱们厘清烘托链路中的每个环节,剔除冗余逻辑,完成高效烘托。
2. 引擎架构
在以上思维的指导下,我将烘托引擎分成了两层:引擎层(Engine)和事务封装层(MediaSDK)。
1)引擎层是渠道无关的,运用C++开发,烘托后端运用了各渠道都支撑的OpenGL结构。中心思维是把烘托链路笼统成有向无环图(DAG),最基础的组件笼统成插件(Plugin),一切的数据源(Source)、算法(Filter)、输出终端(End)都是插件,再界说好插件的输入/输出协议,只需上下流插件的数据交互满足协议就能够自由组合。
2)事务封装层封装了引擎层的调用逻辑,在Android、iOS和Windows渠道上对事务方供给一致调用接口,便利事务同学运用,并供给日志、监控和资源管理等能力。
实践
1. 技术应战
完成进程有两个应战,一个是跨渠道,一个是高功能。
1)跨渠道
a) 引擎层虽然运用了OpenGL作为烘托直播宝盒后端,但Android和iOS体系供给的是OpenGL ES,Windows供给的是OpenGL,这两个版别在shader语法上是有差别的,这就需求引擎和算法去做适配。其次,要运用OpenGL需求在每个渠道上都完成一个上下文环境,iOS是EAGL,Android是EGL,Windows是WGL。各渠道虽然都有封装好的GL组件,可是都不太好用(有Bug),最好的办法仍是自己调用底层API,这就需求对OpenGL有必定的了解。
b) 事务封装层封装了引擎层的底层接口,对外供给一致事务接口。而事务开发是渠道相关的,语言也不尽相同,Android是Java,iOS是OC,Windows是C++。而且像相机、编/解码器、View这些体系组件各渠道完成并不一致。因而开发事务封装层需求对各语言和体系特性都有较深化的理解,才能完成易用性和功能的一致。
2. 高功能
a) 一个思路是尽可能的运用GPU,解放CPU,由于GPU在视频处理方面有天然优势,引擎里的核算基本上都放在了GPU侧,包含图画颜色空间转化、后处理等。而且在某些场景下还会对图画做下采样,进一步降低GPU运用率。
b) 即使算法都运用GPU完成,可是还要面临显存-内存数据互传的问题,从内存上载数据到显存和从显存下载数据到内存都会阻塞CPU,导致CPU占用率高。解决方法一是引擎内部数据都运用纹路传递,尽可能减少显存-内存数据互传。二是运用双PBO,异步传输数据,但这个方案需求留意数据同步的问题。
3. 引擎落地
1)算法接入
由于引擎的算法完成都笼统成了插件,而且将烘托的公共逻辑都提取到基类,算法同学接入算法时只需求重视shader自身就能够了,接入是很便利的。理论上只需符合插件规范,任何算法甚至二方或许三方SDK都是能够做成插件接入进来的。现在引擎接入的算法能力有:人脸检测、美颜、滤镜、2D贴纸,未来还将接入美妆、美体、3D贴纸、Avatar等。
2)事务接入
烘托引擎供给了多种输入,如相机采集、帧序列等;多种输出,如UI、编码、帧序列等,结合前面说到的算法能力,事务方只需求调用简略的几个接口就能够定制自己的烘托管线,从而完成自己的事务需求。现在烘托引擎接入了来疯iOS和Android双端,来疯PC浏览器插件,优来播iOS和Android双端。而且安稳迭代了若干个版别,在多个事务场景中运用,例如秀场直播、电台直播、录屏直播等。
总结与展望
1. 沉淀
回忆整个烘托引擎的开发进程,其实是踩了很多坑,也是对烘托技术的一次深化发掘。整个架构的规划经受住了事务的检测,也为往后相似SDK的开发供给了名贵的经验。
2. 引擎存在的不足
虽然烘托引擎在现在的应用场景中运转良好,但仍是存在一些不足,首要有两点,一个是OpenGL天然生成的缺陷,即OpenGL上下文和线程是强相关的,导致烘托引擎规划上虽然是一个DAG,但实际上管线的一切制作操作都是串行的,不能充分发挥GPU功能;二是引擎内部数据传输只支撑push的方法,即只能上游推动下流消费数据,而不能下流主动从上游拉取数据消费,这就限制了引擎的运用方法。
3. 引擎2.0
前面说到烘托引擎在低端机上功能不佳,首要原因是OpenGL烘托耗时。其实谷歌和苹果都已经在最新的代码中将OpenGL标记为deprecated,分别在推广新一代烘托结构,即Vulkan和Metal,而微软也有自家的烘托结构,即DirectX:
这些新结构思路大同小异,比较OpenGL的优点有:支撑预编译shader、支撑多CPU线程、支撑直接拜访GPU CommandBuffer等,对开发者更友爱,运转功率更高,甚至能到达成倍功能提高。所以,未来烘托引擎的2.0版别将会支撑多backends,包含Vulkan、Metal和DirectX,以完成更好的功能。