android : when using MediaPlayer to play background music, 音效过早停止

标签 android background effects

我正在尝试在我的应用程序上播放背景音乐,并在您杀死敌人时偶尔播放音效等。

所有音效都有效,但后来我开始使用 MusicManager 类(类似于本教程:http://www.rbgrn.net/content/307-light-racer-20-days-61-64-completion)来尝试播放背景音乐并且它有效,但音效在半秒左右后被切断。

我正在使用以下方式播放音效:

 MediaPlayer mp = MediaPlayer.create(context, R.raw.fire); 
 mp.start();

最佳答案

使用 soundpool 代替。 SoundPool 可以同时以不同的音量、速度和循环播放多个流。 MediaPLayer 并不是真正用于处理游戏音频。

我在市场上发布了 2 款游戏,都使用 SoundPool,没有任何问题。

这里这两个函数是直接从我的游戏中取出的。

   public static void playSound(int index, float speed) 
{       
         float streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
         streamVolume = streamVolume / mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
         mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, speed); 
}
public static void playLoop(int index, float speed) 
{       
         float streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
         streamVolume = streamVolume / mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
         streamVolume = streamVolume / 3f;
         mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, -1, speed); 
}

就是这么简单。为了仔细观察这一点,我只使用 playLoop() 来播放背景音乐,因此我降低了音量,但您可以轻松修改代码以在每次播放时手动设置音量。

还有

     mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, -1, speed);

第一个参数 mSoundPoolMap.get(index) 只是一个保存我所有声音的容器。我为每个声音分配一个最终编号,例如

    final static int SOUND_FIRE = 0, SOUND_DEATH = 1, SOUND_OUCH = 2;

我将这些声音加载到这些位置并从中播放它们。 (请记住,您不想每次运行时都加载所有声音,只需加载一次。)接下来的 2 个参数是左/右音量、优先级,然后 -1 设置为循环。

    mSoundPool = new SoundPool(8, AudioManager.STREAM_MUSIC, 0);

这将我的声音池设置为 8 个流。另一个是来源类型,然后是质量。

玩得开心!

关于android : when using MediaPlayer to play background music, 音效过早停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12100401/

相关文章:

android - 带 phonegap 的 Panorama 360 查看器

css - 到达顶部后的粘性 div 横幅

c# - WPF窗口阴影效果

c# - 如何在 Windows 上实现桌面叠加模糊?

python - Pygame粒子效果

android - 如何在 PreferenceScreen 中自定义 CheckBoxPreference 之间的分隔符

java - Android:当手机上有与库具有相同 pkg 名称的应用程序时,避免出现 "complete action using"

以编程方式连接Android WiFi

CSS - 使外部 <div> 背景扩展到内部 <div> 宽度

Android 线性布局 : not displaying correct height