如何将频率(Hz)值传入SoundPool类的Rate参数替换原有速率倍数
SoundPool按频率设置播放速率的实现方法
可以实现,核心原理是播放速率倍数和音频输出频率呈严格正比关系,你只需要先获取原始音频的基准频率,再通过换算得到对应目标频率的速率值传入即可。
具体实现步骤
- 首先提前确认你加载的
sound1对应原始音频的基准频率(记为baseFreq,单位Hz),比如你用的是标准A4音就为440Hz,以实际采样的音频参数为准 - 换算公式:
速率值 = 目标频率 / baseFreq - 注意Android原生SoundPool的速率参数合法范围为
0.5f~2.0f,换算后如果超出这个范围会被系统自动截断,建议换算后主动加范围限制避免异常
代码示例
先封装频率转速率的工具方法:
// 把目标频率转换为SoundPool可用的速率值 private fun freqToRate(targetFreq: Float, baseFreq: Float): Float { val rate = targetFreq / baseFreq // 限制在SoundPool支持的0.5~2.0范围内 return rate.coerceIn(0.5f, 2.0f) }
修改你的播放逻辑,直接传入目标频率即可:
// 假设你的sound1原始音频基准频率为440Hz,可根据实际情况修改 private val BASE_SOUND_FREQ = 440f fun playSound(v: View) { when (v.getId()) { R.id.button_sound1 -> { // 播放440Hz soundPool!!.play(sound1!!, 1f, 1f, 0, 0, freqToRate(440f, BASE_SOUND_FREQ)) } R.id.button_sound2 -> // 播放352Hz soundPool!!.play(sound1!!, 1f, 1f, 0, 0, freqToRate(352f, BASE_SOUND_FREQ)) R.id.button_sound3 -> // 播放484Hz soundPool!!.play(sound1!!, 1f, 1f, 0, 0, freqToRate(484f, BASE_SOUND_FREQ)) R.id.button_sound4 -> soundPool!!.play(sound1!!, 1f, 1f, 0, 0, freqToRate(616f, BASE_SOUND_FREQ)) R.id.button_sound5 -> soundPool!!.play(sound1!!, 1f, 1f, 0, 0, freqToRate(748f, BASE_SOUND_FREQ)) R.id.button_sound6 -> soundPool!!.play(sound1!!, 1f, 1f, 0, 0, freqToRate(880f, BASE_SOUND_FREQ)) R.id.button_sound7 -> soundPool!!.play(sound1!!, 1f, 1f, 0, 0, freqToRate(1012f, BASE_SOUND_FREQ)) } }
如果需要支持超出0.5~2倍速率范围的频率输出,SoundPool本身不支持,可改用AudioTrack实现自定义音频播放,自由度更高。
内容的提问来源于stack exchange,提问作者slahuden akram
相关产品推荐
相关产品推荐

