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


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

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

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

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

有任何想法吗 ?

贾森


16
2017-12-14 05:03


起源




答案:


据我所知,它不能用SoundPool完成。

唯一可以提供完成通知的音频'播放器'是 媒体播放器  - 它比SoundPool更复杂,但允许设置OnCompletionListener在播放完成时得到通知。


12
2017-12-14 06:23



我得出的结论,但我想确定。我肯定要使用媒体播放器,因为SoundPool无法处理大声音(超过100ko我在某处阅读)谢谢 - Jason Rogers
没问题(我昨天忘记了 - Jason Rogers
你对ko是什么意思? - Caipivara
@ DanielG.R。 :我怀疑Jason Rogers只是意味着100k(如100 KB),但键盘上的o键位于k附近,他可能偶然发现了它。 - Squonk
现在我明白了,谢谢 - Caipivara


这就是我做的:

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

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

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


14
2018-02-29 04:09



谢谢; +1。请注意,您在返回之前也会调用pl​​ayer.release()。 - Dan Breslau
谢谢!奇迹般有效! - Tony Ceralva
也许通过某些离线工具(例如ffmpeg)导出音频的持续时间是个好主意,并在应用启动时创建查找表。创建MediaPlayer的AFAIK将涉及意外开销。 - jayatubi


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


5
2017-08-21 21:49



如果需要暂停但其持续时间并不重要,那么这是一个很好的选择。 - 18446744073709551615


与SoundPool相比,MediaPlayer又重又慢,但SoundPool没有setOnCompletionListener。为了解决这个问题,我实施了一个 自定义类 来自SoundPool的setOnCompletionListener。

用法:类似于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();

正在玩:

mPlayer.isPlaying();

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


3
2018-03-11 02:56