Android SoundPool play方法的音量与系统音量的关系

                       

Android中播放音频,除了使用MediaPlayer,还可以使用SoundPool。SoundPool使用音效池的概念来管理多个短促的音效,对于需要短促的提示音的场景特别合适。

通常调用SoundPool.load来加载某个音频文件,获得一个音效id,然后就可以用play方法来播放。

SoundPool的play方法原型如下:

int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate);
  
  
  • 1

play方法第二、三个参数用于指定左右声道的音量,取值范围是0.0~1.0。这里要说的就是这个音量值与系统音量的关系。

比如你使用AudioManager.STREAM_MUSIC或者AudioManager.STREAM_VOICE_CALL来播放提示音,此时的媒体音量或通话音量为 A (AudioManager.getStreamVolume(AudioManager.STREAM_MUSIC),那使用SoundPool.play方法播放音效时,实际的音量大小,就相当于:

leftVolume * A
  
  
  • 1

注意,实际的音量效果,是乘积关系

下面是网上流传的一段代码,其中对音量的设置就存在一个容易忽略的Bug:

AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);int currentVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC);int maxVolume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);float volume = ((float)currentVolume)/maxVolume;...mSoundPool.play(soundID, volume, volume, 1, -1, 1);
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

上面的代码根据当前媒体音量和媒体音量的最大值,计算出一个比值传递给play方法,作为左右声道的音量,这样的结果是缩小了实际音量!尤其是(Bug),你在播放开始前将媒体音量调整为0,开始播放后,你将听不到声音!此时你再通过音量键调整音量,也听不到声音!(我今天刚解了一个类似的Bug)

所以,如果想按照用户设置的音量来播放音效,正确的做法是:

mSoundPool.play(soundID, 1, 1, 1, -1, 1);
  
  
  • 1

而如果想按系统设置音量的一半来播放音效,则可以用类似下面的代码:

mSoundPool.play(soundID, 0.5f, 0.5f, 1, -1, 1);
  
  
  • 1

Android开发文档没有SoundPool.play的音量参数做详尽的说明,不过我们自己需要注意哦,否则就容易出现问题。

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值