一. 背景
随着高清在用户观影过程中的深度普及,人们已经不仅仅满足于视的享受,更需要听的保证。如何稳定保障音质,甚至增加更多的音效玩法需要一套强大的系统将数据传输、音频实时处理技术、音频输出有效地整合起来;而作为一个可以商业化应用的系统,其应具有高性能、高复用、高可靠的特点,在本文我们将探讨如何打造一套具备这些特性的音频渲染引擎。
二.化繁为简的高复用
考虑高复用的一个基本出发点是基于我们面临的问题的复杂性,如图所示:
如果想覆盖市面基本的用户群体,我们至少需要支持5种操作系统的6种渲染接口;以更少的改动支持不同平台的功能演进,从而降低系统的开发维护成本。
1.技术选型及架构设计
一个完整的音频渲染引擎我们可以划分为以下几个模块:音频接口模块、后处理模块、输出模块、缓存模块、音频焦点管理模块。其中输出模块和音频焦点管理一般是依赖系统接口实现,此部分需要针对性的封装,如android需要通过jni技术来反射调用,iOS等系统则需要利用混编技术进行交叉编译,其余模块基于跨平台和性能的考虑我们采用C++实现,最终可设计出如图架构:
2.渲染接口抽象
上文描述,跨平台的重点是不同平台的渲染接口的封装,对于渲染接口封装可以从两个方向出发,一是渲染流程控制,二是渲染能力。一般的渲染接口均可提供latency获取、音量设置等能力,同时为了保障渲染质量,我们也会加上渲染信息统计等能力。另按照消耗数据方式的不同,渲染接口也可以分为同步写、异步写两大类,其中异步写又可以分为托管型和回调型,大部分的回调型需要系统本身保障数据的生命周期,也为设计抽象增加了难度,如上所述最终我们可以抽象出如图的输出接口: