Android的SoundPool口吃,滞后,有时根本不玩

时间:2013-06-25 09:55:05

标签: android audio time soundpool

用例

我有68个钢琴样本,每个大约一个。 174 kB,Ogg数据,Vorbis音频,立体声,s16,44100 Hz,352 kb / s,4秒。

我需要同时播放它们的不同组合(音乐术语:谐波和弦/间隔),例如1st + 7th14th + 22nd等。

另外:当前“回放”需要一个选项,在t毫秒后停止它。

我尝试了什么

一个明显的解决方案似乎是使用SoundPool。设置maxStreams = 20后,我.load()将所有样本添加到其中。每次播放请求都会创建一个线程(实际上是:Scala的future),等待给定t millis,然后停止所有声音。

似乎工作......通常。

问题

  • SoundPool,当同时播放2个(或更多)声音 时,有时无法同时启动它们,它们的开始时间略有不同肯定可以被听到。但是,大部分时间都可以。

  • 还有一个问题就是停止...有时候一对“持续”的时间更长,但是,通常它会在我想要的时候结束。

  • 最后,真的奇怪的是:每个.play()之后的第一个

    • 关闭(或者甚至 dimmed !)显示或
    • 应用程序启动...

    ... 不会发出声音

问题

Android是否为我们提供了更可靠的(就时序一致性而言)声池实现?

如果我创造了68个线程,每个声音一个,它可能会更好吗?...我不这么认为。

1 个答案:

答案 0 :(得分:4)

编辑:可能的解决方案(不是那么优雅?)

Thiago Rosa writes,他已经克服了SoundPool

的滞后
  

(...)通过循环播放静音(...)

     

经过几次测试后,我注意到有时“play”功能需要8ms才能执行,有时会立即执行。

     

结论,似乎当没有播放时,SoundPool正在重置,当它再次播放时,初始化需要时间。

但我真的不相信。它有效吗?电池怎么样?

我的测试表明肯定值得一试。现在样本一直在播放,在几百次测试中只有3-4次有点关闭时间。 其他两个问题(根本没有播放和不一致的停止时间)现在也已经消失了!

然而,电池问题依然存在......