背景
在最新的优酷版本中已经支持了基于端侧实时人体识别的弹幕穿人能力,该能力大致可以分解为视频渲染模块、视频画面识别前处理模块、弹幕mask文件离屏合成模块、弹幕渲染模块,而这些模块正是搭载在我们构建的跨平台渲染引擎OPR上。
其实弹幕穿人对于多媒体播放场景来说只能算较小应用之一,我们甚至可以在弹幕渲染里就罗列出更多的特效例如:3D弹幕、多并发的动态弹幕、需要音视频信息实时配合的节奏弹幕等等;而在音视频渲染领域我们也不仅有画面识别的前处理、更多还有类似超分、插帧、音视频增强、色弱、护眼等观影模式的后处理支持。在多媒体播放这种“争分夺秒”的的场景下如何高效的实现以及组织上述功能,甚至可以实时对渲染效果做检测和统计,以及对于未来视频游戏化、互动化留有空间和技术储备,都是我们需要考虑的,正是基于这种考虑我们设计了跨平台的多媒体渲染引擎OPR,来支撑我们的构想。
OPR架构设计
从功能上来说我们需要将音视频前处理、后处理、渲染,2D(弹幕)渲染,3D渲染,互动及画面检测等能力集成到一起,从特性上来说我们需要兼顾高性能、热插拔、高可维护。纵观市面成熟的引擎,其实我们找不到一款符合上述要求的,GPUImage更多关注的是视频后处理,并且其跨平台实现需要不同技术栈;SDL跨平台技术栈相同但是更多实现的是音视频的渲染,无法基于其实现前后处理的扩展;像FlameMaster更是只实现了Android端的弹幕渲染,局限性太大,无法扩展出炫彩的特效。深究我们提到的2D渲染能力、互动性等其实是一般游戏引擎具有的特点,并且视频游戏化也是未来的方向,基于此我们也需要将游戏引擎纳入我们的考虑,但是游戏引擎存在一个致命的问题就是从基因里就没有考虑过音视频后处理的事情,而后处理一般需要多个复杂算法的串并联执行,需要特殊的设计才能实现。
另外考虑到渲染的高性能需求,我们需要使用native的GPU渲染,在借鉴了cocos2D、GPUImage、SDL等引擎的情况下我们设计出了OPR的基本架构,如图:
可以看出,音频的跨平台实现相对比较容易,音频后处理及渲染均是在CPU中完成,且大部分平台提供的渲染接口也都是基于native的(Android端audiotrack需要通过jni反射Java层接口),同时音频处理算法复杂度和算力消耗相对视频来说均不在一个量级,这些都对我们跨平台的封装