新知 | 腾讯云视立方特效引擎优秀实践——终端篇

新知系列课程第二季来啦!我们将为大家带来全真互联时代下新的行业趋势、新的技术方向以及新的应用场景分享。本期我们邀请了腾讯云音视频技术导师——张伟男,为大家分享腾讯特效引擎在终端的应用和实践。

本次分享会为大家介绍腾讯特效引擎的架构方案设计和特效处理流程,跨平台开发过程中遇到的一些实际问题以及特效引擎SDK集成过程中可能遇到的问题和解决方案。

特效引擎架构设计

考虑到特效引擎SDK有支持多平台的需求,团队在设计的过程中既要保持各端能力的统一,又要支持很好的平台可扩展性以便未来能接入更多的平台。因此,我们设计了一套跨平台的终端架构,整个架构可分为三层,分别是平台API层、平台适配层以及跨平台层。

平台API层提供与平台相关的API接口,目前特效引擎提供Flutter、Unity、Windows、Mac、iOS、Android等平台的特效接口API,包含初始化、设计特效以及特效处理等简洁易用的API。

平台适配层是适配平台层和原生层之间的中间层,承接各个平台的差异并提供上层及底层通信的能力。另外,鉴权管理,特效管理等业务模块以及与平台相关的音视频适配也在这一层实现。

最底层的跨平台层主要由C++实现,提供灵活的特效玩法、美颜、AI能力以及渲染引擎。其中的模板基础框架负责解析tencent effect studio制作工具生成的各种动态模板,调用各个组件系统进行特效处理后交给渲染模块。渲染模块包含2D/3D渲染引擎,底层使用了OpenGL等渲染API接口。

特效是承接直播推流、实时音视频、短视频制作等预处理的中间过程。整体处理流程是在上层SDK抓取到摄像头或视频帧后传输给特效引擎进行特效处理,之后特效引擎输出带特效的图像数据,返回上层SDK进行推流或是渲染保存,其中的关键点在于对输入的原始图像数据进行处理,输出带特效的图像数据。

跨平台数据传输方案

在特效引擎SDK的设计过程中,跨平台数据传输是一大难点。要实现跨平台方案,就需要对数据进行传递和通信,但实现平台层和原生层之间复杂的数据通信和高效的图像数据传输并不容易。

Flutter和Unity的平台层开发语言分别是dart和C#,它们和原生层之间的消息通道只能传递基础数据类型。但在实际的开发过程中,特效引擎需要传递的数据结构非常复杂。因此我们增加了一个类结构体到Json的序列化模块,之后将Json数据通过消息通道传输至原生层。原生层接收后对该Json数据进行反序列化,转化为对应的结构体,实现跨平台之间的复杂数据通信。

腾讯特效SDK通过OpenGL实现特效处理,因此要实现跨平台还需要解决纹理传输的问题。在Flutter版本中,最直接的传输方法是上层的TRTC、直播等SDK通过Flutter插件传递纹理至腾讯特效SDK的Flutter插件,之后特效Flutter插件,再将纹理传输到原生层的特效SDK中进行特效处理。但在具体实现过程中,Flutter为了避免阻塞UI界面,它和原生层的消息发送及响应都使用异步的方法,这也导致纹理经过通信层传递到原生层时,传输数据线程会发生变化,而特效处理需要保持在OpenGL线程,所以纹理在Flutter和原生层之间无法通过传输通道传输。

那么如何才能实现纹理在Flutter和原生层之间不跨线程进行传输呢?最直接的方法便是绕过传输通道,直接打通原生层进行传输。我们最初采用的方案是通过反射代理的方式进行绑定,回调的纹理能够直接传至特效SDK进行处理。但这个方案在测试中的整体性能并不好,会出现丢帧的情况,而且该方案也很容易出现兼容性问题。

为了解决这些问题,我们设计了一个特效处理适配器,分别为纹理的生产者和消费者定制一组协议,定义纹理的支持格式及回调接口,并在原生层进行注册绑定。这样既解决了反射的兼容性问题,也解决了反射带来的性能问题。

在Unity版本,我们也遇到了纹理问题。纹理从Unity传至iOS特效SDK后会出现黑屏、无法渲染的情况。这是因为Unity在2019年版本后,其纹理被固定为Metal纹理,不再提供OpenGL纹理的方式。因此我们需要将Metal纹理转换为OpenGL纹理。Metal纹理绑定Metal Texure,而Metal Texure由Pixelbuffer创建。所以可以直接将Pixelbuffer渲染到OpenGL纹理上,再将OpenGL纹理传递给特效SDK进行处理,处理完成后得到的纹理通过相反的流程转为Metal纹理,给到Unity进行渲染。但这条处理流程非常的繁琐冗余,需要经过Metal转OpenGL再转Metal,渲染链路长,效率低。

Metal纹理由Pixelbuffer创建,OpenGL纹理也由Pixelbuffer创建,它们共用了一个相同的数据结构。如果能够创建一个可供两个平台使用的Pixelbuffer,让它们共用一块内存,那么就可以同时渲染Metal和OpenGL纹理。所以腾讯特效SDK在Unity版本中创建了Pixelbuffer的设置。通过设置Pixelbuffer的属性并让它与OpenGL、Metal兼容,就能够高效地实现Metal转OpneGL。

特效引擎集成实践

腾讯云音视频提供了快速将腾讯特效引擎集成进音视频通话SDK、直播SDK、短视频SDK的Demo指引,根据指引可快速通过工具包实现腾讯特效引擎的接入。下面以腾讯特效SDK接入短视频SDK为例,为大家介绍具体集成步骤。

整个集成流程可分为授权/初始化、设置视频处理回调、设置特效、特效处理、特效销毁五个步骤。第一步,我们需要设置授权并初始化短视频SDK和腾讯特效SDK,之后为短视频SDK设置视频回调参数及特效方式,然后在视频回调处理中调用特效SDK进行特效处理。处理完成后,腾讯特效SDK会返回对应的纹理,短视频SDK再对纹理进行渲染就能够得到带特效的视频。最后在退出制作时,对腾讯特效SDK进行销毁,就完成了整个特效引擎的使用流程。

关于新知

随着行业数字化转型加速,线上线下一体化、数字技术与真实世界融合的全真互联时代正加速到来。腾讯云音视频技术导师将在新知栏目中分享在全真互联时代下新的行业趋势、新的技术方向以及新的应用场景与大家共同探索视界,创见未来!

腾讯云音视频在音视频领域已有超过21年的技术积累,持续支持国内90%的音视频客户实现云上创新,独家具备 RT-ONE™ 全球网络,在此基础上,构建了业界最完整的 PaaS 产品家族,并通过腾讯云视立方 RT-Cube™ 提供All in One 的终端SDK,助力客户一键获取众多腾讯云音视频能力。腾讯云音视频为全真互联时代,提供坚实的数字化助力。