我正在使用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);
}
});
}
答案 0 :(得分:1)
不幸的是,SoundPool播放样本时没有提供监听器。如果您需要此功能,请使用MediaPlayer。
作为一个黑客,您可以在几毫秒(X)内从音频编辑器获取音频文件的长度,然后在您告诉它播放后在您的应用中设置一个计时器。计时器设置为在X毫秒后触发一次。通过这种方式,您可以大致了解声音是否已完成播放。但是,这是一种非常不可靠的方法,如果能够得到帮助,应该避免使用。而是将MediaPlayer类与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);
试一试。