[android] SoundPool详解

今天做一个小Demo用到了SoundPool,总结一下。

MediaPlayer缺点不能重叠播放音乐,封装程度比较高,所以加载起来会比较慢。

SoundPool简介

Android系统提供了另一种播放音效的类。用来加载多个音效,短促音效和多个短促音效,可自行设置声音品质,音量,重复和优先级。在一定场合还是很好用的。

技术分享

属于android.media包下,继承自Object。

  • 构造方法

public SoundPool(int maxStreams, int streamType, int srcQuality) {...}
参数一 maxStreams支持多少个声音(也就是池的大小)
参数二 streamType:指定声音类型通过AudioManager获取对应的常量值。
参数三 srcQuality:采样率变换质量,没用到。默认是0,没查到资料。。

<span style="font-size:24px;">SoundPool<span style="color:#ff0000;"> pool</span> = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);</span>
    指定了该池最多指定三个音频,使用用于系统声音的音频流。于AudioManager参数有很多,可以戳---> AudioManager

  • 加载数据

有四个构造方法:

  • public int load(String path, int priority)
从完整文件路径名载入
path:文件路径
priority:优先级,0的优先级最低
返回值:这个声音的ID,用于打开和关闭音乐。
  • public int load(AssetFileDescriptor afd, int priority)
从Asset对象载入
afd:一个assets文件中的描述器,可以获得assets下文件的信息;
priority:
返回值:
  • public int load(Context context, int resId, int priority)
从APK资源获取 
context:
resId:文件的ID(res文件夹里的文件才有id)
priority:
  • public int load(FileDescriptor fd, long offset, long length, int priority)
从FileDescriptor对象载入  

fd文件描述类的实例
offset从声音文件开始的偏移量(从什么地方播放)
length声音长度
priority

  • 播放

构造方法:
public final int play(int soundID, float leftVolume, float rightVolume,int priority, int loop, float rate)
参数一 soundID:所播放的声音ID,是load方法返回的
参数二 leftVolume:左音量,值从(0.0-1.0)
参数三 rightVolume:右音量,值从(0.0-1.0)
参数四 priority:优先级,0的优先级最低。
参数五 loop:是否循环,0不循环,-1一直循环。
参数六 rate:播放速率,1为正常速率。范围从0.5-2。

如果需要播放多首:需要一个集合来存储音频的ID,就是上面load方法返回的int。
如果指定播放一首:就不用建集合了,假设音频位于
技术分享

<span style="font-size:24px;">//获取资源</span>
<span style="font-size:24px;"><span style="white-space:pre">	</span>AssetFileDescriptor fd = getResources().openRawResourceFd(R.raw.music)</span>
<span style="font-size:24px;">//加载音频
<span style="white-space:pre">	</span>int soundID = pool.load(fd, 1);</span>
<span style="font-size:24px;">//播放音频,soundID是上面的返回值
<span style="white-space:pre">	</span>pool.play(soundID, 1, 1, 0, 0, 1);</span>


这样完成了一首音频的播放。
最后一个问题:播放多首音频。

声明一个集合存放音频
HashMap<Integer, Integer> soundMap = new HashMap<Integer, Integer>();
soundMap.put(1, pool.load(this, R.raw.music1, 1));
soundMap.put(2, pool.load(this, R.raw.music2, 1));
soundMap.put(3, pool.load(this, R.raw.music3, 1));

存放三个音频;
pool.play(soundMap.get(1), 1, 1, 0, 0, 1);
pool.play(soundMap.get(2), 1, 1, 0, 0, 1);
pool.play(soundMap.get(3), 1, 1, 0, 0, 1);

这样就完成多首音频的播放

  • 释放资源及其他

release()方法释放所有SoundPool对象占据的内存和资源。

pause(soundID)暂停播放

stop(soundID)停止播放

......

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。