SoundPool 中的流音量与 AudioManager 中的音量

Posted

技术标签:

【中文标题】SoundPool 中的流音量与 AudioManager 中的音量【英文标题】:stream volume in SoundPool vs volume in AudioManager 【发布时间】:2011-05-10 00:28:24 【问题描述】:

我很困惑……

SoundPool.play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)

这里的音量是从 0.0 到 1.0

我见过的教程建议将流量计算为:

AudioManager mgr = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);

int streamVolume = mgr.getStreamVolume(AudioManager.STREAM_MUSIC);

streamVolume = streamVolume / AudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f);

这是有道理的。

我会假设此音量将覆盖用户在手机中设置的全局媒体音量,我可以通过更改 soundPool 中的流音量来独立更改我的应用的音量。

但实际上它的工作原理类似于乘数 - 如果我将 soundpool 中的音量设置为 0.5,则实际音量将始终是全局音量的一半。非常容易复制:

    设置全局媒体音量 手机设置到最大 使用 soundpool.play 将活动音量设置为 0.5 - 播放声音 将 soundpool.play 中的音量设置为 1 - 播放声音,声音会大两倍

有人能解释一下为什么会这样吗?传递给 SoundPool.play 方法的音量真的是全局音量的乘数吗?

【问题讨论】:

【参考方案1】:

是的,音量参数与全局音量有关。如果您想以当前音量设置播放声音,只需传递“1”作为音量。

【讨论】:

文档并没有真正这么说,它只是说从 0 到 1,并没有提到 1 对应什么。我的印象是 1 是设备的最大音量,但您对 1 是当前全局音量的最大音量的解释解释了我的观察。

以上是关于SoundPool 中的流音量与 AudioManager 中的音量的主要内容,如果未能解决你的问题,请参考以下文章

带循环的 Soundpool 无法正常工作

Soundpool 音量不变

SoundPool 和 MediaPlayer 音量对应问题

Android SoundPool 左/右音量

Seekbar 控制 Soundpool,停止工作

如何通过代码使 SoundPool 静音?