怎么知道soundpool什么时候播放audiofile?

时间:2013-09-02 06:56:16

标签: soundpool

我正在使用soundpool来播放录制的文件。我只是想知道有什么方法可以知道什么时候音池完成播放。这是我下面的工作代码。

public void soundPool() {
    final float playbackSpeed = 1.5f;
    final SoundPool soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC,
            100);

    final int soundId = soundPool.load(audiofile.getAbsolutePath(), 1);
    AudioManager mgr = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    final float volume = mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

    soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
        @Override
        public void onLoadComplete(SoundPool arg0, int arg1, int arg2) {
            soundPool.play(soundId, volume, volume, 1, 0, playbackSpeed);
        }
    });

}

3 个答案:

答案 0 :(得分:1)

不幸的是,SoundPool播放样本时没有提供监听器。如果您需要此功能,请使用MediaPlayer。

作为一个黑客,您可以在几毫秒(X)内从音频编辑器获取音频文件的长度,然后在您告诉它播放后在您的应用中设置一个计时器。计时器设置为在X毫秒后触发一次。通过这种方式,您可以大致了解声音是否已完成播放。但是,这是一种非常不可靠的方法,如果能够得到帮助,应该避免使用。而是将Me​​diaPlayer类与MediaPlayer.OnCompletionListener()一起使用。

答案 1 :(得分:0)

是的,你必须使用媒体播放器...但是使用媒体播放器你无法进行快速转发。我的建议是你使用声音池来播放声音,在播放之前,你可以使用媒体播放器检查声音的持续时间,当时间结束时你可以手动停止soundpool。很简单,我在一个项目中做到了这一点。

答案 2 :(得分:0)

只有一种方法可以获取该音频文件的持续时间并使用线程进行检查。

soundPool.play(soundId, 1, 1, 1, 0, 1f);
new Handler().postDelayed(new Runnable() {
      @Override
      public void run() {
           // do your stuff song is finished

      }
},soundDuration);

试一试。