2

我正在开发一个音乐应用程序,它可以同时播放多种声音,就像一种多轨程序。当需要播放所有声音时,计时器就会触发。声音必须准确地按节拍播放,并完美地同步和混合。

我发现的最简单的解决方案是为每个声音设置一个 MediaPlayer,从一开始就将它们全部初始化,在我的应用程序的 OnCreate() 中使用 MediaPlayer.create()。为了让它更加可靠和快速,我为每个声音制作了两个媒体播放器。然后我有一个调用简单循环的计时器,类似于:

for (int w=0; w<SOUNDS; w++)
    if (must_play(w)) {
        if (mp[w].isPlaying()) {
            if (mp2[w].isPlaying())
                mp[w].seekTo(0);
            else mp2[w].start();
        } else mp[w].start();
    }

我使用 .seekTo(0) 是因为我发现它比 .stop() 和 .start() 稍微快一些。但声音并不总是完美同步的。如果这两个声音是两个应该可以完美播放的鼓,那么两个媒体播放器的 .start() 之间 1/10 秒的延迟是非常烦人的。有没有办法强制所有被指示 .start() 的媒体播放器一次有效地播放?请注意,声音可能很短,例如鼓声:问题不是要让多个媒体播放器随着时间的推移保持同步,而是要让它们完全一起开始,没有延迟。

这个问题相当棘手,因为在我看来涉及两个问题:

  • 优先级,高于可能减慢计时器或应用程序本身的其他进程。
  • 如何创建以原子方式运行所有声音的单个命令/对象/方法(或其他)。

谢谢你。

4

1 回答 1

0

我做到了,只是使用了 SoundPool 类而不是 MediaPlayer。它的响应速度更快,并且可以很好地处理多轨,如果流不够,甚至可以剪切播放的最古老的声音。虽然没有回答问题,但问题已解决。

于 2012-12-06T15:14:51.960 回答