音乐特效控制
标签(空格分隔): android
作者:陈小默
水平有限,如果错误恳请批评指正
Android提供了用于音乐播放时的音效控制器,比如均衡器、重低音以及显示音乐波形等。这些功能被定义在AudioEffect的子类中完成1:
- AcousticEchoCanceler:回声消除器
- AutomaticGainControl:自动增强控制器
- NoiseSuppressor:噪音抑制器
- BassBoost:重低音调节器
- Equalizer:均衡器
- PresetReverb:预设音场控制器
- Visualizer:示波器
Demo下载地址:Android:音乐特效控制demo 注意:Demo中如果跟该博客有冲突,以博客为准。在正文开始之前,我先说一声,我的音频文件(jay_qingtian.mp3)放在了手机的Music文件夹下。下面所有播放按钮的实现都是下面的样子,所以在下面各小节中我就省略不写播放的实现了
val music = "${Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).absolutePath}/jay_qingtian.mp3"
private val mp = MediaPlayer()
...
XXX.setOnClickListener { v ->
v.isEnabled = false
mp.setDataSource(music)
mp.prepare()
mp.start()
}
一、AcousticEchoCanceler:回声消除器
回声消除器的用法相当简单,只要调用它的静态方法创建相应的实例即可调用。但是需要注意的是:不是所有的手机都支持这个功能,所以我们在使用之前应该提前调用isAvailabel()方法判断是否可用。
//初始化媒体播放器和回声消除器
private val mp = MediaPlayer()
private val canceler = AcousticEchoCanceler.create(mp.audioSessionId)
...
//在回声控制按钮的点击事件中判断可用状态
aecFunction.setOnClickListener { v ->
if (AcousticEchoCanceler.isAvailable()) {
canceler.enabled = !canceler.enabled
} else {
Toast.makeText(this, "您的手机不支持回声控制", Toast.LENGTH_SHORT).show()
}
}
对了,很重要的一点是在退出Activity的时候关闭媒体播放器
override fun onDestroy() {
if (mp.isPlaying) {
mp.stop()
}
canceler?.release()
super.onDestroy()
}
二、AutomaticGainControl:自动增强控制器
这个控制器同样基于系统实现,不同的手机可能支持情况也不相同。使用时仍然是三步走:
1,初始化播放器可控制器
private val mp = MediaPlayer()
private val control = AutomaticGainControl.create(mp.audioSessionId)
2,点击自动增强时判断状态
agcFunction.setOnClickListener {
if (AutomaticGainControl.isAvailable()) {
control.enabled = !control.enabled
} else {
Toast.makeText(this, "您的手机不支持自动增强", Toast.LENGTH_SHORT).show()
}
}
3,离开时关闭(同上)
三、NoiseSuppressor:噪音抑制器
噪音抑制器的用法与前两个别无二致。主要用法同上
private val mp = MediaPlayer()
private var suppressor = NoiseSuppressor.create(mp.audioSessionId)
...
nsFunction.setOnClickListener {
if (NoiseSuppressor.isAvailable()) {
suppressor.enabled = !suppressor.enabled
} else {
Toast.makeText(this, "您的手机不支持噪音消除", Toast.LENGTH_SHORT).show()
}
}
四、BassBoost:重低音调节器
Android中给重低音调节器设置了1000个级别,也就是当我们的seekBar的最大值就是1000。接下来我们看一看重低音调节器的用法
1,初始化
private val mp = MediaPlayer()
private val mBass = BassBoost(0, mp.audioSessionId)
其第一个参数代表该音效控制器的优先级,这里设置为0,第二个参数仍然是MediaPlayer的id。
2,给SeekBar设置监听使之能够控制重低音调节器。
bbSeekBar.max = 1000