我需要播放多个持续时间不同的音频文件,比如 5 到 30 秒。我想为右/左声道独立设置音量,并应用效果,如混响或失真。那么,我应该使用哪个 API?
另外,我在 AudioTrack API 上找不到太多文档。你知道我在哪里可以找到例子吗?谢谢。
我需要播放多个持续时间不同的音频文件,比如 5 到 30 秒。我想为右/左声道独立设置音量,并应用效果,如混响或失真。那么,我应该使用哪个 API?
另外,我在 AudioTrack API 上找不到太多文档。你知道我在哪里可以找到例子吗?谢谢。
声音池实际上是音频混合器。它只能播放短片,无论它们是编码为 ogg 还是 mp3 还是未压缩。声音池总是将它们存储在未压缩的内存中,并且您必须知道限制是 1 MB。如果您的剪辑在内存中太大,声音池将静音,您会发现以下错误:“AudioFlinger 无法创建轨道。状态:-12” 媒体播放器播放流并实时解码。所以它可以播放更长的剪辑,但需要处理器能力。
所以媒体播放器更适合背景音乐,而声音池更适合短音频效果(点击、爆炸、声音循环)。此外,声音池可以同时播放更多片段,并具有音量和速度控制。它还可以播放循环。
请注意:如果剪辑未完全加载和解码,则无法播放声音池中的音乐。所以你必须使用 OnLoadCompleteListener (Android 10 或以上) 来检查它。如果您在解码之前尝试播放声音,声音池将被静音。
媒体播放器不会遇到这些问题。
除了其他答案的建议之外,MediaPlayer 和 SoundPool 之间的一个区别是,在 MediaPlayer 中,当声音剪辑已经在播放时,您无法播放它(该功能在游戏中尤其有用)。MediaPlayer 需要剪辑完全完成才能再次播放。我认为这些信息是在官方网站上提供的。
但是,SoundPool 没有这样的问题,而且我注意到 SoundPool 仅在调用时播放音频(我有时注意到使用 MediaPlayer 时有轻微延迟)。
我认为这(部分)是人们说 SoundPool 更适合游戏等短声音的原因。希望这可以帮助:)
MediaPlayer 不支持为多通道设置音量。
我认为 SoundPool 是这里唯一适合您需求的东西。
编辑:是的,您需要一个 SoundPool,请阅读: https ://blog.csdn.net/chen_cheng_fly/article/details/7357350
还有一件事要补充的是,所有其他答案都完全错过了。在 MedialPlayer 中,您可以获得媒体完成事件,而在 SoundPool 中没有像完成事件那样的东西。您必须自己应用逻辑。