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】:

确保MediaPlayerSoundPool 在同一音频流上播放。这是通过在 Android 5 下设置 int streamType 和在 Android 5+ 上设置 AudioAttributes 来完成的。

streamType 将成为AudioManager 中的stream constants 之一,例如STREAM_MUSIC

使用builder 构造AudioAttributes 对象。您不再直接处理流类型。例如,Android 会根据您在setUsagesetContentType 中传递的内容为您的播放器分配一个流

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 和 MediaPlayer 在一段时间后循环播放的哔声停止

Soundpool vs Mediaplayer 用于播放多种音效

Android Studio 中的 SoundPool 到 MediaPlayer

Android - MediaPlayer/SoundPool 性能?

MediaPlayer 或 SoundPool 用于多个短声音?