声网在音视频 SDK 的基础上,进行了云市场插件接口的封装。开发者可以通过对接插件的传输接口,将自己实现的功能封装为插件功能,其他开发者在使用声网 SDK 的同时可以集成该插件,将其融入到他们的实时互动场景中。本文源自 RTE 2021 创新挑战赛获奖团队的分享。他们基于该插件接口封装实现了一个人脸识别插件。

像是美颜、滤镜、贴纸这些功能,众多的音视频 SDK 厂家都内部集成的,其便捷性和音视特效处理在今天依然有很高的使用频率。但随着时间的推移,带来的功能冗余和可扩展性不高也逐渐呈现,功能冗余的问题比如客户端业务方不需要太多的功能特效,或者觉得有更好的三方特效可以使用等。可扩展性方面是可以开放部分能力让开发者接入方来承担特效的集成,可以用于预研或科研目的。这样创新来创新去,也加大了包体积。
鉴于以上的思考,自己的想法的是渴望能有一款纯净的音视频 sdk 。只提供基本的音视频传输功能,音视特效的处理交由给接入方去”加花”。这就比如操作系统的 Ghost Win 和 MSDN ISO 镜像区别。要原版纯净不要装其他用不到的吃电脑内存的软件。
Agora 引擎 C++ 似乎是提供了这样一套系统,能任意集成各类音视频插件,只要遵循与引擎交互的流程,加入你要的插件,即可产出一款符合自身业务需要的音视频 SDK。自制甜品,任意加料。

本项目先封装 Agora 引擎相关的插件接口,然后选用一个人脸识别插件来展示整体的效果:
插件介绍:
BRFv4:它可以支持人脸检测、追踪、以及多脸的追踪识别,对脸部轮廓、眼睛、眉毛、鼻子、嘴巴位置等识别到的区域以 3D 点状作出反馈。
官网:
(Beyond Reality Face - BRFv4 - API reference:
https://tastenkunst.github.io/brfv4_docs/)
Demo 将展示插件的部分功能做展示,你会发现真的很简单。
脸部追踪
微笑识别
打哈欠识别




加载:通过插件管理中心加载插件调用插件管理中心加载人脸识别插件

初始化:通过 Agora 引擎插件接口传入初始化参数

使用插件功能:同样也是通过 Agora 引擎插件接口传入参数

Log:可以通过监听 Agora 引擎的事件感知到插件内部的参数流动

插件开关:说白了就是要不要使用这个插件处理你的音视频数据

经过简单理解,本次的作品项目做两件事:
封装一套通用的插件管理中心作 Agora 引擎和业务插件的中间层。提供的能力是可以方便集成多个不同品类的业务插件,与其交互。
封装完后,以模拟一个 App 功能实验的目的,引入一个人脸识别插件,以测试它的实用性和商用可能性。
插件内部流程细节可在Github查阅到:https://github.com/AgoraIO-Community/RTE-2021-Innovation-Challenge/tree/master/Technology-Challenge/%E3%80%90Cookies%E3%80%91%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB
这里想说明的一点是在理解的过程中发现它也开放了原生 Objective-C 的插件协议,支持原生的插件。让我加强了插件封装的广度。

关于使用方法中的插件开关功能这里展开来说明一下,Agora 引擎内部有一个插件接口:

每帧数据帧都会经过这个接口返回出来给开发者做二次处理。
并且是有一个接口来控制它是否回调。

经过调试,这个 setEnabled:(bool) 起不到作用。
于是再翻了翻引擎内部声明,在它顶层找到了这个方法:

最终得以实现功能。
不得不说注释写的很详细。

作品封装的目的能极少的代码给开发者提供丰富的功能效果。对于以往设计 SDK 的经验而言,相信的一个想法思路是:对外开放的类、接口越少,对外使用就更简单,对内的设计以及稳定性可维护性就越高。
由于声网云市场插件开放不久,网上的资料都不多,基本是封闭的,官方技术文档也在逐步完善中,所以在项目初期上手方面遇到一些困难,且我的 C++ 也忘的差不多了。所幸有官方的耐心指导,不断的交流确认,再结合接口的注释,最终顺利的把自己的想法体现到项目出来。而且在交流过程中,得知云市场接口还在不断迭代, 开放更多功能接口。期待越来越好!

