(四)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,初始化

Android中给重低音调节器设置了1000个级别,也就是当我们的seekBar的最大值就是1000。接下来我们看一看重低音调节器的用法
1,初始化

    private val mp = MediaPlayer()
    private val mBass = BassBoost(0, mp.audioSessionId)

其第一个参数代表该音效控制器的优先级,这里设置为0,第二个参数仍然是MediaPlayer的id。
2,给SeekBar设置监听使之能够控制重低音调节器。

        bbSeekBar.max = 1000
        bbSeekBar.progress = 0
        bbSeekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
            override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
                bbCurrent.text = "$progress"
                mBass.setStrength(progress.toShort())
            }

            override fun onStartTrackingTouch(seekBar: SeekBar) {
            }

            override fun onStopTrackingTouch(seekBar: SeekBar) {
            }
        })

五、Equalizer:均衡器

 

 

简单说明一下均衡器的原理:调整某一频率声音的分贝。
所以我们在使用均衡器之前需要先获取当前系统支持的所有可调整的频率,从我上面的截图可以看出我的手机目前仅支持60、230、910、3600、14000Hz这些频率。
1,获取能够设置的最小和最大分贝数
        val minLevel = mEqualizer.bandLevelRange[0]
        val maxLevel = mEqualizer.bandLevelRange[1]

2,获取均衡器支持的所有频率

val bands = mEqualizer.numberOfBands

3,针对每一种频率设置布局并给SeekBar设置滑动事件

for (i in 0..bands - 1) {
    val view = layoutInflater.inflate(R.layout.item_e, null)
    val holder = ItemHolder()
    holder.bind(view)
    //设置该均衡器控制器频率
    holder.eCurrent!!.text = "${mEqualizer.getCenterFreq(i.toShort()) / 1000} Hz"
    //设置均衡器最小值
    holder.eMin!!.text = "${minLevel / 100} dB"
    //设置均衡器最大值
    holder.eMax!!.text = "${maxLevel / 100} dB"
    //给SeekBar设置值和拖动监听
    holder.eSeekBar!!.max = maxLevel - minLevel
    holder.eSeekBar.progress = mEqualizer.getBandLevel(i.toShort()).toInt()
    holder.eSeekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
        override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
            mEqualizer.setBandLevel(i.toShort(), (progress + minLevel).toShort())
        }
        override fun onStartTrackingTouch(seekBar: SeekBar?) {
        }
        override fun onStopTrackingTouch(seekBar: SeekBar?) {
        }
    })
    activity_e.addView(view)
}

六、PresetReverb:预设音场控制器

 

 

对于音乐小白们来说,调音乐真是一件麻烦事,还好Android内置了一些音场供我们选择,接下来我们看看怎么设置系统设置的音场吧:
1,初始化(这里初始化的除了音场控制器还有一个均衡器,另外用一个List存储预设音场的名字)
    private val mp = MediaPlayer()
    private val mPresetReverb = PresetReverb(0, mp.audioSessionId)
    private val mEqualizer = Equalizer(0, mp.audioSessionId)
    private val nameList = ArrayList<String>()

2,获取所有预设名字

        for (i in 0..mEqualizer.numberOfPresets - 1) {
            nameList.add(mEqualizer.getPresetName(i.toShort()))
        }

3,使用Spinner作为选择工具,并且在选择监听中使用均衡器(预设音场控制器只定义了音场,具体实现需要均衡器)

        prSpinner.adapter = ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, nameList)
        //设置选择监听
        prSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onNothingSelected(parent: AdapterView<*>?) {
            }

            override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
                mEqualizer.usePreset(position.toShort())
            }
        }

 

转载处:https://www.jianshu.com/p/cdd09b840500

 

posted @ 2020-03-28 10:33  xtusir  阅读(1312)  评论(0编辑  收藏  举报