AudioTrack、SoundPool 或 MediaPlayer 我应该使用哪个?

Posted

技术标签:

【中文标题】AudioTrack、SoundPool 或 MediaPlayer 我应该使用哪个?【英文标题】:AudioTrack, SoundPool or MediaPlayer Which Should I use? 【发布时间】:2012-11-11 16:53:11 【问题描述】:

我需要播放多个持续时间不同的音频文件,例如 5 到 30 秒。我想为右/左声道独立设置音量,并应用效果,如混响或失真。那么,我应该使用哪个 API?

另外,我在 AudioTrack API 上找不到太多文档。你知道我在哪里可以找到例子吗? 谢谢。

【问题讨论】:

【参考方案1】:

声音池实际上是音频混合器。它只能播放短片,无论它们是编码为 ogg 还是 mp3 还是未压缩。声音池总是将它们存储在未压缩的内存中,并且您必须知道限制是 1 MB。如果您的剪辑在内存中太大,声音池将静音,您会发现以下错误: “AudioFlinger 无法创建轨道。状态:-12” 媒体播放器播放流并实时解码。因此它可以播放更长的剪辑,但需要处理器能力。

所以媒体播放器更适合背景音乐,而声音池更适合短音频效果(点击、爆炸、声音循环)。此外,声音池可以同时播放更多片段,并具有音量和速度控制。还可以循环播放。

请注意:如果剪辑未完全加载和解码,则无法播放声音池中的音乐。所以你必须使用 OnLoadCompleteListener (android 10 或以上) 来检查它。如果您在解码之前尝试播放声音,声音池将静音。

媒体播放器不会遇到这些问题。

【讨论】:

【参考方案2】:

播放音频​

如果您想在您的 Android 应用中播放音频,有三种 API 可供选择​

MediaPlayer - 实时流式传输和解码本地或远程文件。适用于长剪辑和背景音乐等应用程序。更多的 CPU 和资源密集型。初始化时间比较长。 MediaPlayer 是一个状态机!​

SoundPool - 适用于短音频效果或剪辑。未压缩存储在内存中,1MB 限制。播放前必须完全加载剪辑。支持音量和速度控制、循环、同步声音、优先级。​

AudioTrack - Android 上最低级别的音频 API。它提供了一个您可以配置的通道。向通道推送和拉取字节数据。配置速率、采样、音频格式等,可以解码不支持格式的音频。​

总之,MediaPlayer 是一个很好的通用类来播放文件,SoundPool 非常适合短音频效果,AudioTrack 可以让你进入低级音频配置。

​ 参考 - https://en.proft.me/2018/05/8/how-play-audio-file-android/ ​

【讨论】:

【参考方案3】:

除了其他答案的建议之外,MediaPlayer 和 SoundPool 之间的一个区别是,在 MediaPlayer 中,您不能在已经播放的声音剪辑中播放它(该功能在游戏中尤其有用)。 MediaPlayer 需要剪辑完全完成才能再次播放。我认为官方网站上提供了这些信息。

但是,SoundPool 没有这样的问题,而且我注意到 SoundPool 仅在调用时播放音频(我有时注意到在使用 MediaPlayer 时有轻微延迟)。

我认为这是(部分)人们说 SoundPool 更适合短声音(例如游戏)的原因。 希望这会有所帮助:)

【讨论】:

【参考方案4】:

MediaPlayer 不支持为多通道设置音量。

我认为 SoundPool 是这里唯一适合您需求的东西。

编辑:是的,您需要一个 SoundPool,请阅读以下内容: https://blog.csdn.net/chen_cheng_fly/article/details/7357350

【讨论】:

好的,谢谢,我会尝试使用 soundpool。 MediaPlayer 支持分别设置左右声道的音量。这是一个很好的例子:codota.com/android/methods/android.media.MediaPlayer/setVolume 另外你可以参考这里的文档:developer.android.com/reference/android/media/…【参考方案5】:

还要补充一点,所有其他答案都完全错过了。在 MedialPlayer 中,您可以获得媒体完成事件,而在 SoundPool 中没有像完成事件那样的东西。您必须自己应用逻辑。

【讨论】:

以上是关于AudioTrack、SoundPool 或 MediaPlayer 我应该使用哪个?的主要内容,如果未能解决你的问题,请参考以下文章

Android SDK 提供的3套音频播放的API之玩转SoundPool

Android SoundPool:AudioFlinger 错误

Android 上 SoundPool 的奇怪错误

在静态模式下使用 AudioTrack 的正确方法是啥?

Android平台中关于音频播放

Android:AudioTrack 在开始时会发出咔哒声