4 题: Android SoundPool:播放结束时收到通知

在...创建的问题 Tue, Dec 14, 2010 12:00 AM

这个声音很简单,我无法弄清楚为什么我找不到答案lol

我有一个有效的声音池类(感谢教程和我做过的一些调整),它工作正常。

现在的问题是我希望能够随机改变我的背景音乐。 (并不总是在循环中有相同的音乐,但有2或3,当一个完成时,我会播放其他2个中的一个)。

问题是我找不到通知音乐播放完毕的方法。

有什么想法吗?

杰森

    
17
4个答案                              4 跨度>                         

据我所知,无法用SoundPool完成。

我知道唯一能提供完成通知的音频'播放器'是 MediaPlayer - 它比SoundPool更复杂,但允许设置OnCompletionListener在播放时得到通知已经完成了。

    
12
2010-12-14 06:23:34Z
  1. 我得出的结论,但我想确定。我肯定要使用媒体播放器,因为SoundPool无法处理大声音(超过100ko我在某处阅读)谢谢
    2010-12-14 06:35:52Z
  2. 没问题(我忘记昨天做了
    2010-12-15 03:47:40Z
  3. 你对ko的意思是什么?
    2014-09-15 00:26:20Z
  4. @ DanielG.R。 :我怀疑Jason Rogers只是意味着100k(如100 KB),但键盘上的o键接近k,他可能偶然发现了它。
    2014-09-15 09:49:43Z
  5. 现在我明白了,谢谢
    2014-09-16 16:14:12Z
  6. 醇>

这就是我的所作所为:

启动上,我使用MediaPlayer获取每次声音点击的长度:

 
private long getSoundDuration(int rawId){
   MediaPlayer player = MediaPlayer.create(context, rawId);
   int duration = player.getDuration();
   return duration;
}

并将声音加上持续时间存储在一起(在DTO类型的对象中)。

    
15
2012-02-29 04:09:20Z
  1. 谢谢; +1。请注意,在返回之前还要调用player.release()。
    2012-04-27 20:13:46Z
  2. 谢谢!像魅力一样工作!
    2013-11-06 01:19:14Z
  3. 通过某些离线工具(如ffmpeg)导出音频的持续时间可能是个好主意,并在应用启动时创建查找表。创建MediaPlayer的AFAIK将涉及意外的开销。
    2015-03-14 10:45:26Z
  4. 醇>

我有超过100个短声音片段,SoundPool是我的最佳选择。我想在另一个剪辑完成播放后播放一个剪辑。一旦发现没有onCompletionListener()等价,我选择实现runnable。这对我有用,因为第一个声音长度在1到2秒之间,因此我将runnable的持续时间设置为2000.希望它们能够在这个类上工作,因为它有很大的潜力!

5
2013-08-21 21:49:56Z
  1. 如果需要暂停但其持续时间不是很重要,那么这是一个很好的选择。
    2013-10-11 06:08:35Z
  2. 醇>

与SoundPool相比,MediaPlayer又重又慢,但SoundPool没有setOnCompletionListener。为了解决这个问题,我使用setOnCompletionListener从SoundPool实现了自定义类

用法:类似于MediaPlayer

创建:

 
SoundPoolPlayer mPlayer = SoundPoolPlayer.create(context, resId);
mPlayer.setOnCompletionListener(
    new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {  //mp will be null here
            Log.d("debug", "completed");
        }
    };
);
mPlayer.play();

暂停:

 
mPlayer.pause();

车站:

 
mPlayer.stop();

履历:

 
mPlayer.resume();

IsPlaying模块:

 
mPlayer.isPlaying();

欢迎任何拉动请求。我只在这里实现了我需要的东西。

    
3
2016-03-11 03:13:09Z
来源放置 这里