【问题标题】:Seamless Looping with SoundPool on Android?在 Android 上使用 SoundPool 无缝循环?
【发布时间】:2011-12-25 21:36:54
【问题描述】:

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

使用 MediaPlayer 的结果也好不到哪里去。期望在 android 上无缝播放音频循环是不合理的吗?肯定有人有类似的功能正常工作吗?如果是这样,我很想看看它是如何工作的一个例子。

谢谢!

【问题讨论】:

  • 我在同一条船上,WAV 文件的表现同样糟糕:完美的无缝循环似乎是不可能的。如果您尝试淡入/淡出轨道的第一个和最后 10 个样本,那么您会非常清楚地听到毫秒长的停顿,没有咔嗒声,但是淡入淡出非常可听.. o_O
  • 虽然你想要的东西很麻烦,但你总是可以使用 AudioTrack,它使用连续的比特流。
  • 这听起来很愚蠢,但是(显然)期望无缝、无缝的音频播放是不合理的。

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


【解决方案1】:

我使用了一个适用于单个文件的 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 毫秒,它工作正常。我不得不承认这是一个不太理想且的解决方案,但至少它完成了它的工作。

【讨论】:

  • 它可以工作,但是当应用程序在后台时,循环有一点间隙
  • 你能扩展一下这个例子吗?例如,你在哪里调用 start() 或 prepare()?
  • 这对我根本不起作用。也许是因为我没有像@Primož'c0dehunter'Kralj 暗示的那样在正确的地方实现它。
【解决方案2】:

我找到了其他解决方案:

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!!!!

【讨论】:

  • 不工作,暂停 beetwen 循环发生
【解决方案3】:

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

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

  2. 您可以创建 2 个 MediaPlayer 对象,并且(就像 @Beowulf Bjornson 的回答一样)在 MediaPlayer #1 结束之前大约

希望来这里的人尝试我所说的,因为我浪费了大约 3 天的时间试图弄清楚这一点,结果却惊讶于没有一种开箱即用的方法可以完美地做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 2014-01-12
    相关资源
    最近更新 更多