在Android中管理MediaPlayer加载的多个音频源的好方法是什么?

Max*_*tin 1 android android-mediaplayer

我编写 Android 游戏,其中一个单元有 3 个音频阶段:

  • 被击中
  • 攻击
  • 死的

所以我在我的单位对象中添加了以下代码:

    MediaPlayer mMediaPlayerGetHit = null;
    MediaPlayer mMediaPlayerDead = null;
    MediaPlayer mMediaPlayerAttack = null;
Run Code Online (Sandbox Code Playgroud)

constructor

  mMediaPlayerAttack=MediaPlayer.create(context,R.raw.fly_monster_attack1);
  mMediaPlayerDead=MediaPlayer.create(context,R.raw.fly_monster_death1);
  mMediaPlayerGetHit=MediaPlayer.create(context,R.raw.fly_monster_gethit1);

  mMediaPlayerAttack.setOnPreparedListener(this);
  mMediaPlayerDead.setOnPreparedListener(this);
  mMediaPlayerGetHit.setOnPreparedListener(this);

  ....
Run Code Online (Sandbox Code Playgroud)

现在看起来很乱

嗯,3 个玩家对象,每个单位状态一个。

MediaPlayer我确信它的方式是错误的,我需要更改有关单位状态的每次源,

但性能问题就来了:

可以说我MediaPlayer已经获取了来源attack

之后,我将其切换到get hit,然后再次切换到attack

也许我需要以某种方式保存MediaPlayerwith的实例attack并重用它?

我不认为这是数百次切换我的穷人的好方法MediaPlayer

有任何想法吗?

谢谢你,

Mar*_*res 5

您应该看一下 SoundPool 类,我认为它更适合您想要做的事情,这里是如何使用它的一个很好的示例:

http://www.edumobile.org/android/android-programming-tutorials/sound-pool-example-in-android-development/

SoundPool 非常适合游戏,我在我的游戏中使用过它并且工作完美,该类允许您同时轻松循环、播放和停止多个声音,而无需为每个操作创建一个 MediaPlayer,您需要担心的是使用完后释放池。另外,根据您正在做的事情,它有一个非常有效的优先级系统,允许您设置要播放的最大数量的声音,并根据优先级让另一个声音继续播放并在插入新声音时占用另一个声音的资源......

文档:

优先级从低到高,即数字越大优先级越高。当调用 play() 会导致活动流的数量超过创建 SoundPool 时 maxStreams 参数建立的值时,使用优先级。在这种情况下,流分配器将停止优先级最低的流。如果有多个流具有相同的低优先级,它将选择最旧的流来停止。如果新流的优先级低于所有活动流,则新声音将不会播放,并且 play() 函数将返回为零的 StreamID。

问候!


Jad*_*eld 5

对于像这样的短声音片段,您确实应该考虑使用SoundPool而不是 MediaPlayer,尽管它使用 MP 来解码音频。它是为低延迟流而设计的,并且允许同时使用多个流。

除了低延迟播放之外,SoundPool 还可以管理一次渲染的音频流的数量。构造 SoundPool 对象时,maxStreams 参数设置此单个 SoundPool 一次可以播放的最大流数。SoundPool 跟踪活动流的数量。如果超过最大流数,SoundPool 将首先根据优先级,然后根据该优先级内的年龄自动停止先前播放的流。限制最大流数量有助于限制 CPU 负载并降低音频混合影响视觉效果或 UI 性能的可能性。

因此,对于像游戏这样需要同时渲染多个声音的东西,SoundPool 可能是理想的选择。