Android/Linux/音频/驱动
全部博文(41)
分类: Android平台
2016-12-19 17:21:47
这段时间接手 Android 音频子系统,相应 Framework 层的内容也让我在负责。这其中有一个叫 AudioEffect 的概念一直很困扰我,因为我之前一直是在底层开发转悠的,接触的都是 HAL、驱动、寄存器这些东西,里面也没看到过 AudioEffect 这种说法啊。按我之前的理解,音效的设定譬如均衡器、回声消除的配置应该是通过硬件来实现的,但在这 2 天解决一个 bug 的过程中,又看了不少 Android 官网上的描述文档,让我对 AudioEffect 这个东西有了更正确的认识。
那么什么是 AudioEffect 呢?它实际上是定义在音频 Framework 层的一种类(Class),由它派生出了 Equalizer、Virtualizer、BassBoost、PresetReverb、EnvironmentalReverb 等派生类。上层开发者使用这些派生类就可以声明相应的 AudioEffect 对象了,再将其应用到 AudioTrack 或 MediaPlayer 实例上进行音效控制。由此可见,AudioEffect 实际上是一个上层纯软件的概念,通过纯软件的方法对音效进行控制。
常见的 AudioEffect 类型和作用大致如下:
Equalizer AudioEffect(均衡器)
均衡器可以被用来改变特定音源输入的频率响应或经混音后的主要输出音频的频率响应。APP 在 Framework 层创建 Equalizer 对象并实例化一个 Equalizer 引擎,通过它们可以对每一个频带的增益进行精确地控制。
Virtualizer AudioEffect(虚拟器)
虚拟器是对把各个声道进行空间化的这类音效的统称。这类音效的具体行为与设备上输入音频的类型、声道数和输出音频的声道数有关。比如在一个立体声输入、立体声耳机输出的场景中,虚拟器实际执行的是立体声扩展音效。APP 在 Framework 层创建 Virtualizer 对象并实例化一个 Virtualizer 引擎。
BassBoost AudioEffect(低音增强器)
低音增强器被用于增强音频中的低频部分,相当于一个只能对低频声音进行增益控制的简单均衡器。APP 在 Framework 层创建 BassBoost 对象并实例化一个低音增强引擎。
PresetReverb AudioEffect(预设混响器)
一个声音在产生后会往各个方向传播。如果这个声音是在室内产生的,接收方会首先听到音源本身发出的声音,然后听到来自墙壁、天花板和地板的回声。这些回声又会在传播到障碍物上时产生二次回声、三次回声...接收方会持续不断地听到声音,这每一次声音的辨识度越来越低,且响度随时间衰减。混响器(Reverb)对于音频接收者的环境建模非常重要,它可以被用于模拟在不同环境中播放音乐产生的效果,或者在游戏中为玩家生成更加沉浸式的音频体验。APP 可以通过预设混响器提前配置全局的混响参数,这种方式在为音乐播放添加混响效果时被广泛使用。如果 APP 需要配置更高级的环境声混响参数,最好使用环境声混响器来实现。APP 在 Framework 层创建 PresetReverb 对象并实例化一个混响引擎。
EnvironmentalReverb AudioEffect(环境声混响器)
如上文所述。