近年兴起的移动直播,其富有特色的模式吸引了海量用户,已成为网络社交和粉丝经济的超级入口。在直播过程中,声音是主播与观众互动的重要途径,为了丰富直播内容、带动气氛、增加趣味性,主播普遍会使用音效软件。例如,在演唱类直播中,主播伴随背景音乐演唱,这时主播往往希望为自己声音增加混响效果,营造出一种现场演唱的氛围;在搞笑类直播中,主播经常进行变声处理,女声变男声,男声变女声,或者变成机器人的声音等。
想要实现这些效果,需要直播软件对采集到的声音进行处理,为了让主播实时听到处理后的声音效果,以便根据效果进行调整,直播软件需要提供低延时回放,将效果呈现给主播。因此,直播软件背后的声音处理方案就起到了非常关键的作用。目前针对不同的操作系统,如苹果的iOS和谷歌的Android,有着为数众多的不同方案,效果不一。金山云作为视频云行业的领跑者,提供的声音处理方案,以出色的声音效果,赢得了众多移动直播APP的青睐。下面就以金山云直播SDK集成的苹果AudioUnit系列API方案为例,为各位详解基于iOS系统的移动直播音效,是如何实现的。
AudioUnit特点解析
从实际效果上说,苹果AudioUnit系列API方案,要比针对谷歌Android系统的跨平台声音处理库libsox等方案要好。一个原因在于,对于音效处理,苹果提供了非常丰富的音频API,涵盖采集、处理、播放各个环节,并按照需求的层次进行了分组。
苹果iOS系统音频框架概览
从上图中可以看到,离底层驱动和硬件最近的就是AudioUnit系列API。与其它声音处理方案相比,AudioUnit包含以下这些优缺点:
优点:
–低延时,从采集到播放回环可到10ms这一级别
–动态变更配置组合
–直接获得后台执行权限
–CPU资源消耗较少
缺点:
–专有概念比较多,接口复杂
–提供C风格API
由于AudioUnit并不完美,特别是专有概念比较多,接口也比较复杂,因此如果技术薄弱,在开发时难度会很大,金山云直播SDK解决了开发难度大等问题,这也是金山云SDK倍受欢迎的原因之一。
AudioUnit这个名字比较形象,它的主体是一系列单元节点(unit),不同的单元节点可实现不同的功能,将一个或多个单元节点添加到AUGraph(全称是Audio Processing Graph,把各个unit组合在一起,起到管理作用)中,并建立单元节点之间的连接,音频数据顺次通过各个节点,即可完成对声音的采集、处理和播放。如下图所示,AUGraph显示出了这个音频处理系统的构成,提供了启动和停止处理系统的接口。
AudioUnit示意图
如下方表格所示,苹果iOS系统提供了四类单元节点:
purpose
Audio units
Effect
eg. Reverb
mixing
eg. Multichannel Mixer
I/O
eg. Remote I/O
Format conversion
eg. Format Converter
其中,I/O主要负责设备,比如采集和播放;Mixing负责将不同来源的音频数据进行混合;Effect负责对音频数据进行音效处理,Format Conversion负责格式转换,比如重采样等。这里有个优化的点,由于Multichannel Mixer本身就有格式转换的功能,输入和输出的音频数据格式可以不同,因此利用这一点,可以节省一个格式转换单元。
AudioUnit中的音频采集
在直播应用中,我们主要使用Remote I/O unit进行采集。由于一个AUGraph中只允许有一个I/O unit,因此Remote I/O需要同时负责采集和播放。当用户开启耳返功能时,需要将采集到的声音,经过处理后再送回当前节点直接播放。