我正在开发一个音乐应用程序,它可以同时播放多种声音,就像一种多轨程序。当需要播放所有声音时,计时器就会触发。声音必须准确地按节拍播放,并完美地同步和混合。
我发现的最简单的解决方案是为每个声音设置一个 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() 的媒体播放器一次有效地播放?请注意,声音可能很短,例如鼓声:问题不是要让多个媒体播放器随着时间的推移保持同步,而是要让它们完全一起开始,没有延迟。
这个问题相当棘手,因为在我看来涉及两个问题:
- 优先级,高于可能减慢计时器或应用程序本身的其他进程。
- 如何创建以原子方式运行所有声音的单个命令/对象/方法(或其他)。
谢谢你。