在Android上使用SoundPool进行无缝循环?

时间:2011-12-25 21:36:54

标签: android audio android-emulator android-mediaplayer soundpool

我正在尝试使用SoundPool类循环短(20kb),无间隙ogg文件,并且在硬件上进行测试时无法获得一致的结果。它总是使用模拟器完美播放,但是当我在Nexus 1或Samsumg Galaxy Tab 10.1上进行测试时,每个循环点都会有可听见的弹出或点击。非常奇怪的是,虽然一旦应用程序启动一致,但每次重新启动应用程序时的点击次数会略有不同,并且在极少数情况下(平板电脑上更频繁地)循环播放正确。

使用MediaPlayer的结果并不好。想要在android上无间隙播放音频循环是不合理的吗?当然有人有类似的功能正常工作?如果是这样,我很想看到它如何运作的一个例子。

谢谢!

3 个答案:

答案 0 :(得分:4)

我使用的hack适用于单个文件:

HACK_loopTimer = new Timer();
HACK_loopTask = new TimerTask() {               
    @Override public void run() {
        mMediaPlayer.seekTo(0);
    }
};
long waitingTime = mMediaPlayer.getDuration()-mHackLoopingPreview;
HACK_loopTimer.schedule(HACK_loopTask, waitingTime, waitingTime);

只需将mHackLoopingPreview设置为合理的金额;我使用100毫秒,它工作正常。我不得不同意这是一个不太理想的丑陋的解决方案,但至少它可以完成它的工作。

答案 1 :(得分:1)

我找到了其他解决方案:

afd = assetManager.openFd(nameSound);

player.setDataSource(afd.getFileDescriptor(),
                     afd.getStartOffset(), afd.getLength() - 1000);
afd.close();
player.prepare();
player.setLooping(true);
player.start();

您只需要将持续时间定义为1000(1ms),而不是总持续时间。 Y eso es todo,problema resuelto !!!!

答案 2 :(得分:0)

这可能听起来像一个警察,但你可以尝试两件事,第一件对我有用。

  1. 以48kHz采样率和48Kbit / s制作音频文件ogg格式(这对我有用)

  2. 您可以创建2个MediaPlayer对象(就像@Beowulf Bjornson的回答一样)大约< = 100ms在MediaPlayer#1结束之前启动MediaPlayer#2并在整个时间之间交替。

  3. 希望那些来到这里的人尝试我所说的,因为我已经浪费了大约3天的时间来试图解决这个问题,只是惊讶于没有开箱即用的方法来完美地完成这项任务。