2012-12-04 62 views
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()之間的延遲時間的1/10是非常煩人的,如果這兩個聲音是兩個應該完美排列的鼓。 有沒有辦法強制指示.start()有效播放所有媒體播放器? 請注意,聲音可能非常短,像鼓的聲音:問題不在於讓多個媒體播放器隨着時間的推移而保持同步,而是讓它們始終在一起,毫不拖延。

的問題是相當棘手的,因爲在我看來,涉及到兩個問題:

  • 優先,上面可能定時器或程序本身減緩等工序。
  • 如何創建一個單獨的命令/對象/方法(或其他),以原子方式運行所有的聲音。

謝謝。

+0

我不認爲媒體播放器的多個實例會隨時間保持同步,因爲它們都使用自己的內部計時機制。對於這些類型的應用程序,您需要一個能夠使用相同定時機制播放多個音軌的(自定義)媒體播放器... – Veger

+0

請注意,我正在討論非常短的音頻文件,如鼓聲,問題不在於隨着時間的推移同步,但使它們同時啓動。我在主文章中添加了這個說明。 –

+0

你好?你找到答案了嗎?跟蹤同步有完全相同的問題。 –

回答

0

我做到了,只是使用了SoundPool類而不是MediaPlayer。它的響應速度更快,並且可以處理非常好的多音軌,即使在流不夠的情況下也可以播放最早播放的聲音。雖然問題沒有得到解答,但問題已解決。