You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将频率(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 00:06:03