Android:为什么MediaPlayer播放的声音比SoundPool声音更响亮?

时间:2014-10-04 05:46:23

标签: android audio

您可以在Android上使用MediaPlayer或SoundPool播放声音。 使用MediaPlayer时,我们的两个Android设备播放的声音相同。 在第三个设备上,音量听起来相同。

你知道为什么吗? 我可以让SoundPool播放与MediaPlayer一样响亮的声音吗?

有问题的设备:

代码:使用SoundPool播放mp3声音

private void playSoundPool() {
    int MAX_STREAMS = 2;
    SoundPool soundPool = new SoundPool(MAX_STREAMS, AudioManager.STREAM_MUSIC, 0);
    soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
        @Override
        public void onLoadComplete(SoundPool soundPool, int soundId, int status) {
            int loop = 0;
            int priority = 0;
            float rate = 1.f;
            soundPool.play(soundId, 1, 1, priority, loop, rate);                    
        }
    });
    soundPool.load(this, R.raw.test, 1);
}

代码:使用MediaPlayer播放mp3声音

private void playMediaPlayer() {
    MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.test);
    mediaPlayer.setVolume(1, 1);
    mediaPlayer.start();
}

欢迎您download test project

2 个答案:

答案 0 :(得分:0)

可能的解决方案:

您需要创建 AudioManager 来获取,更改用户在手机中设置的全局媒体音量,并通过更改soundPool中的流量来独立更改我们自己应用的音量。

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 中为音量设置 0.5 ,则实际音量将始终是全局音量的一半。很容易重现:

  • 将手机设置中的全局媒体量设置为最大
  • 使用soundpool.play将活动中的音量设置为0.5 - 播放声音
  • 将soundpool.play中的音量设置为1 - 播放声音,这将是两次 响

因此传递给SoundPool.play方法的音量确实是全球音量的乘数! **因此,如果您想以当前音量设置播放声音,请通过" 1"作为音量或根据要求改变**

可以是使用全球媒体卷播放音频文件的媒体播放器类。你使用的是硬编码的soundPool.play(soundId, 1 1 ,优先级,循环,速率);价值观!

我们需要尝试

MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.test);
mediaPlayer.setVolume(streamVolume,streamVolume);
mediaPlayer.start();

更多文字:

  

的Soundpool:

     

SoundPool专为短片而设计,可以保存在内存中   解压缩以便快速访问,这最适合应用或游戏中的音效。将这种方法与音板一起使用是件坏事   这个想法,因为你将加载大量的“中等”大小的声音   记忆,你可能超过你的限制(16Mb)并得到一个   OutOfMemoryException异常。 SoundPool使用单独的加载音乐文件   线程,主线程的操作不会阻止UI。    它可以用来播放短的声音片段,比如枪声   一场比赛(不到3秒钟)。一个很好的功能   声音池附带的是你可以同时播放很多声音   当你想到一个游戏时会发生很多事情。所以你先建立一个   声音池对象加载所有媒体文件。   MediaPlayer的:"

     

MediaPlayer专为更长的声音文件或流而设计   最适合音乐文件或更大的文件。文件将被加载   每次调用create时从磁盘调用,这将节省内存空间   但引入了一个小延迟(不是很明显)。

参考: SO

答案 1 :(得分:-1)

机制存在差异,正如您所说,由于压缩和解压缩,声音质量和音量可能低于实际值,并且当您将其与MediaPlayer进行比较时。因此,最好使用MediaPlayer以获得更好的音质和音量。

<强>的Soundpool

SoundPool专为短片而设计,可以在内存中解压缩以便快速访问,这最适合应用或游戏中的声音效果。将此方法与音板一起使用是一个坏主意,因为您将大量“中等”大小的声音加载到内存中,您可能会超出限制(16Mb)并获得OutOfMemoryException。

<强>的MediaPlayer

MediaPlayer专为较长的声音文件或流而设计,最适合音乐文件或较大的文件。每次调用create时都会从磁盘加载文件,这样可以节省内存空间,但会引入一个小延迟(不太明显)。