3

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

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

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

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

如何为这样的游戏设计声音,其中最重要的是让所有音轨同步在一起?

4

1 回答 1

1

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

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

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

于 2013-08-31T17:43:05.137 回答