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

40

如果我需要能够:

  • 播放多个不同长度的音频文件,如5到30秒。
  • 分别为左/右声道设置音量。
  • 应用音效(如混响/失真)。

那么,我应该使用AudioTrack、SoundPool还是MediaPlayer API呢?

此外,我找不到有关AudioTrack API的文档。 有人知道在哪里可以找到示例吗?

5个回答

64

SoundPool实际上是一种音频混合器。
它只能播放短片段,无论它们是作为“ogg”还是“mp3”编码,或者是未压缩的。 SoundPool总是将它们以未压缩的形式存储在内存中,请注意限制为1 MB。 如果您的剪辑在内存中太大,SoundPool将会静音,并显示以下错误:“AudioFlinger无法创建轨道。 状态:-12”

MediaPlayer播放流并实时解码。
它可以播放更长的片段,但需要处理器功率。

结论:
SoundPool:
= 更适用于短音效(点击,爆炸声,声音循环)。
= 可以同时播放更多片段,并具有音量和速度控制。 它还可以播放循环。
MediaPlayer
= 更适用于背景音乐
= 当已经播放相同的音频剪辑时,无法再次播放该剪辑。 它需要完全完成剪辑后才能再次播放。

注意:
如果剪辑未完全加载和解码,则无法从SoundPool播放音乐。 因此,您必须使用OnLoadCompleteListener(Android 10或更高版本)进行检查。 如果在声音解码之前尝试播放音频,则SoundPool将会静音。 MediaPlayer不会出现这些问题。


19

播放音频

如果你想在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/


9
除了其他答案提到的外,MediaPlayer和SoundPool之间的一个区别是,在MediaPlayer中,当音频正在播放时,你不能播放音频片段(这个特性在游戏中可能会有帮助)。MediaPlayer需要等待音频片段完全结束后才能再次播放。我认为这些信息可以在官方网站上找到。
然而,SoundPool没有这样的问题,我还注意到,当我使用MediaPlayer时,有时会出现轻微的延迟,而SoundPool只在被调用时播放音频。
我认为这部分是人们认为SoundPool更适合短声音(例如在游戏中)的原因之一。希望这可以帮到你 :)

3

好的,谢谢,我会尝试使用SoundPool。 - Fede
MediaPlayer支持分别设置左右声道的音量。这里有一个很好的例子:https://www.codota.com/android/methods/android.media.MediaPlayer/setVolume 此外,您还可以参考文档:https://developer.android.com/reference/android/media/MediaPlayer.html#setVolume(float,float) - Shoaib Anwar

0
还有一件事要补充,所有其他答案都完全忽略了。在MedialPlayer中,您可以在媒体完成事件中获取媒体完成事件,而在SoundPool中没有类似的完成事件。您必须自己应用逻辑。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接