00:00
大家好,我是来自腾讯云音视频产品中心的张伟楠,目前在负责短视频和特效引擎SDK相关的研发工作。本次给大家分享的主题是腾讯特效引擎在终端的应用和实践。那本次的内容主要主要包含以下三点,先介绍一下腾讯特效引擎的架构方案设计和特效的一个处理流程,接着给大家分享在实际跨平台开发中所遇到的一些问题,最后结合特效引擎呃,SDK在集成过程中进行一些问题案例的一些讲讲讲。那首先来看一下腾讯特效引擎的一个整体架构,考虑到我们SDK有支持多平台的一个需求,在设计的过程中,我们既要保持各个端的能力的统一,又要支持很好的平台可扩展性,未来能支持更多的平台接入,我们设计了一套跨平台的终端架构,我们可以看到整个架构分为三个层,包含平台API层、适配层以及跨平台层。
01:07
API层主要就是提供跟平台相关的API接口,包含初始化包呃设置特效以及特效处理的简洁简洁应用的API。目前特效引擎提供了非常全面的平台能力,包含安卓、iOS Unity的。适配层主要是适配平台层和原生层之间的中间层,承接各个平台的差异和提供上层以及底层通信的一个能力。另外另外一些业务模块,例如建成管理,特色管理以及跟平台相关的云视频适配也是在呃这一层实现的。最底层是跨平台层,主要是用C加加来实现,提供灵活的特效玩法,例如挂件。背景分割、特效滤镜等AI能力,例如人脸关键点位的一个检测,手势识别、分割检测。呃,在下面是一个模板的基础框架解析,呃,腾讯pencils studio制作工具生成的各种各样的动态模板,然后调用各个组件系统进行特效处理,最后交给渲染模块。渲染模块包含2D3D渲染引擎,底层使用了open gl等渲染API接口。
02:20
那接着我们来看一下特效的一个处理流程。特效是承接推流、实时音视频、短视频制作等音处理的一个中间过程,在抓取到摄像头或者是视频解真之后,给到特效引擎进行特效处理,输出处理后的一个图像数据,再返回给上层SDK进行推流或者是渲染保存。整个处理流程的关键点是实现对输入的一个原始数据进呃进行处理,然后输出带特效的一个图像数据。那在了解完特效处理的一个架构方案和处理流程之后,我们要实现跨平台方案,需要对数据进行呃传递和通信,那如何实现平台层和原生层之间的一个复杂?
03:08
数据通信和高效的一个图像数据的一个传输,这是我们在研发过程中需要解决的问题。接下来分别对这两个问题进行一个详细的探讨。呃,我们知道Fla或者Unity,它的平台成了一个开发语言,是大和算那和原生成之间的消息通讯只能传递基础的一个数据类型,而我们实际的开发过程中需要传递比较复杂的一个数据结构,呃,例如设置特效属性的一个接口的话,它里面的包含的。是结构体是非常复杂的,然后那我们是如何实现上层和原生层之间的一个数据交互呢?呃,我们的做法是设计一套,呃。类结构体到精的序列化的一个一个模块,然后通过消息通道传输数据到原生成,然后原生成进行对这个生层数据进行一个反序列化,然后转化成对应的结构体,实现了跨平台之间的负载的一个数据通信。
04:13
那我们前面说到。特效的关键处理流程是对输入的图像数据进行处理后返回输出的图像数据,那我们的特效SDK底层是用open gl来实现的,对应的图像数据就是纹理,那我们要实现Fla版本的话,需要从呃其他的Fla插件,例如TRTC或者是呃呃。直播直播SDK传递纹理到特效,特效的Fla插件,然后特效的插件再把这个纹理呃传到原生成的。特效SDK里面进行一个特效处理,但是我们在实现过程中,我们发现纹理的传递到原生成的时候,原本回调是在open gl生成的,但是传递到特效SDK原生成之后。
05:05
现场已经发生了变化。那经过分析,我们发现这是因为。避免阻塞UI界面和原生成的消息发送。以及响应都是在使,都是使用的异步的方法,而我们的特效处理是需要在open gl线程,那我们如何才能实现纹理在Fla和原生成之间不放线程进行传输呢?那我们那我们进行一个思考,既然就是传输通道,没有办法,是不是可以换一个思路,要过这个通道进行一个传输,直接在原生成进行一个打通,这样的话就能实现纹理保存在原来的open最好线程。好,那我们首先想到的就是通过反射代理的方式进行一个方法的一个绑定回调的纹理直接传到特效SDK进行处理。那看上去整个问题已经解决了,但是我们呃,测试的过程中发现整个性能并没有那么好,就是出现会出现丢帧的情况,呃,我们知道就反射的话就是需要显类和方法,那如果SDK的接口有变化的话,也会出现兼容的问题。
06:15
那我们怎么样解决去解决这样的两个问题呢?呃,为了解决这个这个问题,我们实现了一个特效的一个处理的一个适适配器,分别为纹理的生产者和消费者定制一组协议,然后定义好纹理的一个支持格式和回调的接口,在原生成进行一个注册绑定,这样既能解决反射的兼容性,也能解决解决反射带来的一个性能问题。目前的话,这个适配是已经呃上传到top还有Mar,然后面呃其他的SDK的接入的话,也可以按照这个协议来进行打通文理的一个传输。呃,我们在实现了Fla的版本之后,然后在处理Unity的平台的时候,也遇到了纹理的问题,那纹理从Unity传给iOS特效SDK之后,呃,整个看上去是是一个黑屏的,虽然不出东西,然后我们通过查资料,我们发现的话,就是说在Unity呃2019年版本之后,它的纹理的话是固定是呃mental metal的纹理那。
07:22
并没有提供呃open g管理的方式,但是我们的SDK需要的是open g,呃,我们想到有两种解决,两种方案来解决这个问题,一种是将Unity的版本进行一个降级,但是长期这不是一个办法,然后呃另外一种方案的话,就是进行一个纹理的一个呃转换,把metal的纹理转成open gl的纹理。呃,那我们按照met的一个渲染步骤的话,就是说首先创建metal纹理,Metal纹理的话是绑定。Met tattoo。嗯,把title的话是用呃pel buffer来创建的,那我们直接可以拿pel buffer渲染到open的纹理上,然后再将open gl的纹理传给特效。
08:08
进行处理,处理完之后的纹理再通过相反的流程转回metal纹理。给到Unity进行一个渲染,那我们可以看到整个流程的话是非常的繁琐,用于呃,经过metal转文,转open gl再转metal,那整个渲染的一个链条非常的长,那有没有更好的更高效的一个方案呢?那我们只是只是研究发现metal纹理是绑定metal ta的,Metal ta的话是通过t buffer创建的,T buffer是存储在共程共享寄存器的一个数据,那open gl的纹理也是绑定了p buffer,他们共用了一个相同的一个数据结构,那我们是不是有有没有什么办法可以创建一个他们共同使用的一个piece buffer,然后呃在两个呃平台上面进行使用,这样的话就是unit的纹理渲染远到metal纹理上,也就是渲染到了open gl的纹理上,他们共用了一块内存,这种方法是最高效的。
09:10
OK,我们最终呃。通过创建的一个。设置,设置好它的属性,然后呃,把它设置为open g,跟metal进行一个兼容,然后实现了metal转open g的高效的一个方法。那接下来我们看看特效引擎的个集集成方案,我们提供了集成腾讯特效引擎,腾讯特效引擎呃音视频直播,然后短视频SDK的一个DEMO的一个指引,可以通过咱们的SK里面的工具包快速实现特效的一个接入,下面使用特效sdku g SV来进行一个讲解。那整个集成的流程主要分为以下几个步骤,首先是设置授权和初始化USV以及特效SDK,然后对USV设置视频一个回调,然后呃。
10:09
在设置特效的一个一个方法,然后在视频回调处理里面调用特效SDK进行一个特效的处理。处理完之后返回对应的一个纹理,然后UGSV再对纹理进行一个渲染,这时候我们就可以看到带有特效的视频画面。那在退出录制的时候,对特效SDK进行一个销毁,整一个的话就是。呃,腾讯特效引擎的一个使用流程。好,最后给大家分享一下特效SDK在执行过程中遇到了一些问题。那第一点的话就是在使用S特效SDK的时候,然后我们可能会遇到一些黑屏和白屏的现象,这时候的话我们是可以通过。我们的一个接口嘛,整个纹理给单下来,然后保存成了地面,因为纹理在ID里面是是调试不到的,就是我们看不到纹理的一个,呃,图片内容,照片内容的话,我们就很难去呃定位这样的一个问题,到底是在特效处理前还是特效处理后出现的问题。
11:17
那如果我们看到是特效处理前的纹理就不对了,那我们的话就是可以定定位到,就是说在外面传入给特效引擎的时候,这个纹理本来就是有问题的,这时候就可以看外面的SDK是不是哪里设置有问题,然后如果是处理后纹理不对,那我们可以检查一下特效引擎的一个接口的调用时序是不是有问题。那第二点的话是退出释放特效引擎的时候,呃,偶尔会出现crash的一个情况,嗯,我这时候我们可以检查一下特效SDK的一个释放接口,需要在对open线程里面进行释放,那这里面的原因就是呃。
12:00
咱们引擎释放的时候是需要对open需要一个环境进行一个销毁,所以在呃。所以需要把on放在open she线程里面去进行调用,那第三个问题的话就是呃,有时候会遇到屏幕旋转之后,整个视视频大小已经变化了,然后特效并没有生效,那遇到这种情况的时候就是可以检查一下,呃。视频变化的时候,有没有设置那个size,因为整个底层是依赖这个大小进行一个AI的一个识别。那最后一个问题的话,就是我们有提供动态加载的一个方案,那有些呃,客户就是在接入的时候会遇到一个so的,我们是可以通过检查步骤完SOSO一个路径接口,然后再调用健全成功之后的话,再开始去初始化特效引擎的一个API,然后避免提前调用接口找不到so的一个情况。
13:09
那以上就是我本次的分享,谢谢大家。
我来说两句