SoundPool 和 MediaPlayer 音量对应问题
Posted
技术标签:
【中文标题】SoundPool 和 MediaPlayer 音量对应问题【英文标题】:SoundPool and MediaPlayer volume correspondence problem 【发布时间】:2019-10-30 10:30:19 【问题描述】:在带有 android 6.0.1 的 Alcatel POP 4+ 中,SoundPool 声音的音量非常低,而 MediaPlayer 声音的音量却很高,而无需改变音量,只是播放声音。在其他设备和模拟器中它可以完美运行。
我正在使用这个声音池播放 SFX:
soundPool.play(soundID[sound], 1, 1, 0, loop, 1);
以及使用这个的音乐:
mPlayer.setOnPreparedListener(new OnPreparedListener()
@Override
public void onPrepared(MediaPlayer mp)
mPlayer.start();
);
如您所见,我没有指定音量,但在带有 Android 6.0.1 的 Alcatel POP 4+ 中,SFX(SoundPool)的音量非常低。
我尝试用mPlayer.setVolume(1, 1);
为MediaPlayer
指定第1 卷,但结果是一样的。
如何解决?
【问题讨论】:
【参考方案1】:确保MediaPlayer
和SoundPool
在同一音频流上播放。这是通过在 Android 5 下设置 int streamType
和在 Android 5+ 上设置 AudioAttributes
来完成的。
streamType
将成为AudioManager
中的stream constants 之一,例如STREAM_MUSIC
。
使用builder 构造AudioAttributes
对象。您不再直接处理流类型。例如,Android 会根据您在setUsage
和setContentType
中传递的内容为您的播放器分配一个流
new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build()
对于 Lollilop 之前的 SoundPool
,请使用现已弃用的 constructor:
new SoundPool(maxStreams, streamType, 0)
对于棒棒糖之后的SoundPool
,使用它的builder:
new SoundPool.Builder()
.setMaxStreams(maxStreams)
.setAudioAttributes(audioAttributes)
.build()
对于 MediaPlayer
在 Lollipop 之前调用 setAudiostreamType(int streamType)
在 prepare
之前。
对于 MediaPlayer
在 Lollipop 之后调用 setAudioAttributes(AudioAttributes)
在 prepare
之前。
通常在STREAM_MEDIA
上播放音乐,STREAM_RING
上响起电话,STREAM_ALARM
上响起警报等等。做用户期望的事情。
当没有播放音量按钮控制STREAM_RING
。当有任何东西使用STREAM_MUSIC
时,音量按钮可以控制它。至少在我的运行 Android 8 的手机上。我不确定 Android 9 或 10 的情况发生了变化。
【讨论】:
以上是关于SoundPool 和 MediaPlayer 音量对应问题的主要内容,如果未能解决你的问题,请参考以下文章
SoundPool 和 MediaPlayer 在一段时间后循环播放的哔声停止
Soundpool vs Mediaplayer 用于播放多种音效
Android Studio 中的 SoundPool 到 MediaPlayer