高效的大量声音工作

时间:2014-03-08 16:14:18

标签: android android-mediaplayer soundpool

我正在开发一款Android应用程序,可让用户播放短片(平均约3秒,绝对最大值为10秒)音频片段(最可能的格式为mp3)。点按一下按钮。将会有大约10组这些声音,每组将有大约100个声音。只要一个声音在任何时间播放就足够了。声音不按特定顺序播放,因此我们永远无法知道接下来会播放哪种声音。用户可以随时更改正在播放的声音集。

我的问题是如何有效地实现这种音频剪辑的播放。当前(天真且无效)实现使用MediaPlayer加载每个声音应播放,播放,然后释放它。这很糟糕,因为MediaPlayer应该用于较长的声音文件。每个声音都按需加载,因此不会发生预加载。播放声音时会有轻微的延迟,因为在用户交互后发生加载,并且播放必须等待负载。

我想到的一些可能性:

  1. 使用SoundPool并按需加载。每当我们加载声音时,在OnLoadCompleteListener中实现实际播放,并在声音结束后释放。这与当前实现类似,但使用SoundPool。或者,不要立即释放,而是仅在交换集合时释放。
  2. 使用MediaPlayer并压缩所有声音文件(短暂静音以分隔声音)到一个更长的mp3中,然后使用seekTo()在音频剪辑中找到正确的时间。声音的实际播放将发生在OnSeekCompleteListener,这将从我们跳到的时间开始恢复,完全播放声音的持续时间,然后暂停。这需要在应用程序中抛出较长的声音之前进行一些预处理,例如将所有声音压缩到一个文件中,然后在数据库中存储偏移量和长度。一个较长的声音(代表整个声音)将异步预加载。
  3. 在方法1中使用SoundPool,但预加载(当然是异步)我们可能正在使用的整组声音(~100个声音)。当用户按下按钮时,我们只检查声音是否已经加载到声音池中,如果没有,则等待加载完成。当用户切换声音集时,所有加载的声音都被丢弃,并开始下一组声音的异步加载。我担心等待负载可能会导致延迟,我们希望尽可能地减少(ofc)。
  4. 问题是,哪种方法最有效。我特别害怕方法2和方法3可能存在一些问题,例如寻求花费太长时间,或预加载花费太长时间来处理大量小文件。

    我希望我清楚一切。有没有人对我在这里提出的方法有经验?您认为(或更好,知道)将是最好的方法。谢谢你的回答。

0 个答案:

没有答案