2013-08-31 38 views
1

我正在嘗試創建一個基於音樂的遊戲(類似於「我的歌唱怪物」),這個想法是我有一個場景可以放置並從場景中移除幾個不同的角色,每個角色都有一個獨一無二的mp3文件,用於演唱。在Android上同步多個音頻軌跡

我用cocos2dx構建我的遊戲,雖然對於聲音我正在使用自定義引擎,它目前在Android上使用MediaPlayer API。只是在場景加載時播放它們,然後根據場景中的哪個角色進行靜音和取消靜音。問題是,在較舊的設備上,聲音似乎不同步,我假設我需要一種預先緩存加載前的mp3文件。

我試着在高級中創建所有mediaPlayers並使用prepare()方法,然後將它們保存在hashmap中,並在場景開始播放時使用play()。不幸的是它沒有奏效,曲目仍然不同步。我不確定MediaPlayer是如何工作的,所以我不知道在高級中創建它是否等同於預緩存。標準的cocos2dx聲音引擎使用soundpool,我知道這對大文件不好,我不確定它是否有緩存機制。在Ios上我已經有了一個使用openAL的聲音引擎,並且在我測試過的ipad 4上它工作得很好。

你建議我爲了同步曲目做什麼?實現另一個聲音引擎?也許基於openSL?或者以某種方式保留一個計時器並使用它來同步軌道。

如何爲這樣的遊戲設計聲音,讓所有音軌同步到一起是最重要的事情?

+1

crossposting是灰心:http://gamedev.stackexchange.com/questions/61554/syncing-multiple-audio-tracks-on-android –

回答

1

問題是每個MediaPlayer代表一個單獨的流,它可能在不同的時間開始。即使你同時啓動所有的啓動(這是不可能的),也無法保證操作系統會同時加載並實際啓動每一個啓動。

據我所知,Android沒有提供同步多個流的方法。即使提供這種功能的操作系統,它也非常麻煩,而且通常不是100%準確的。

正確的解決方案是打開一個單一的流,例如使用audio track接口,並在將數據發送到流之前進行MP3解碼和混合。

+0

任何人都有一個很好的教程,如何實現這一目標?我認爲更好的選擇是以某種方式在本機代碼中執行它,因爲我需要爲IOS做同樣的事情,但是單獨的代碼也可以。 –

+0

唉,我從來沒有見過類似的東西(這不是說它不存在)。這可能會有所幫助:http://blog.bjornroche.com/2013/05/the-abcs-of-pcm-uncompressed-digital.html –