用例

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

我需要同时 演奏它们的不同组合(音乐术语:和弦/音程),例如1st + 7th14th + 22nd等。

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

我尝试过的

一个明显的解决方案似乎是使用SoundPool。设置maxStreams = 20后,我对所有示例进行.load()。对于每个播放请求,都会创建一个线程(实际上是Scala的future),等待给定的t millis,然后停止所有声音。

通常,似乎可以工作。

问题

  • 当同时播放2个(或更多)声音时,此SoundPool有时有时无法完全同时启动,因此肯定可以听到它们的开始时间略有不同。但是,大多数时候都可以。
  • 停止还有一个问题...有时一对“持续”时间更长,但同样,通常它在我想要的时间结束。
  • 最后,到底是什么怪异的:每个.play()在以下两个之后都是第一个:
  • 关闭(或什至仅变暗!)显示或
  • 应用程序启动...

  • ... 不会产生声音!
    问题

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

    如果我创建68个线程(每个声音一个线程),可能会更好?...我不这么认为。

    最佳答案

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

    Thiago Rosa writes,他克服了SoundPool的落后



    但是我并没有真正的说服力。有效率吗?电池呢?

    我的测试表明,绝对值得一试。样本现在可以持续播放,在几百次测试中,只有3-4次少了关闭时间。 另外两个问题(根本不播放和停止时间不一致)现在也消失了!

    但是,电池问题仍然存在。

    10-07 19:31
    查看更多