在android上同步多个音轨

时间:2013-08-31 14:56:49

标签: android android-mediaplayer cocos2d-x audio

我正在尝试创建一个基于音乐的游戏(类似于“我的歌怪”)。我的想法是我有一个场景,我可以放置并从场景中删除一些不同的角色,每个角色都有一个独特的mp3为歌唱而存档。

我正在使用cocos2dx构建我的游戏虽然我正在使用自定义引擎,但目前在Android上使用MediaPlayer API。为了将所有声音同步在一起,我只需在场景加载时播放它们,然后根据场景中的哪个角色静音和取消静音。问题是在较旧的设备上声音似乎不同步,我认为我需要一种方法来预先缓存mp3文件。

我尝试在高级中创建所有mediaPlayers并使用prepare()方法,然后将它们保存在hashmap中,并在场景开始播放时使用play()。不幸的是它没有用,轨道仍然不同步。我不确定MediaPlayer是如何工作的,所以我不知道尝试在高级中创建它是否等同于预缓存。标准的cocos2dx声音引擎使用soundpool,我理解这对于大文件并不好,我不确定它是否有缓存机制。在IOS上,我已经有一个使用openAL的声音引擎,在ipad 4上,我测试它运行正常。

为了同步曲目,您建议我做什么?实现另一个声音引擎?也许基于openSL?或以某种方式保留计时器并用它来同步曲目。

如何为这样的游戏设计声音,让所有曲目同步在一起是最重要的事情?

1 个答案:

答案 0 :(得分:1)

问题是每个MediaPlayer代表一个单独的流,它可能在不同的时间开始。即使你同时调用所有这些(这是不可能的)启动,也无法保证操作系统会加载并实际同时启动每个操作系统。

据我所知,Android无法同步多个流。即使操作系统提供此功能,它也非常麻烦,通常不是100%准确。

正确的解决方案是打开单个流,例如使用audio track接口,然后在将数据发送到流之前进行MP3解码和混音。