Android SoundPool播放音频 一看就懂
MediaPlayer存在如下缺点:
1、 资源占用率较高,延迟时间较长
2、 不支持多个音频同时播放
而SoundPool使用音效池的概念来管理多个短促的音效,例如它可以开始就加载20个音效,以后在程序中按音效的ID进行播放
SoundPool主要用于播放一些较短的声音片段,优势在于CPU资源占用量低和反应延迟较小。还支持自行设置声音的品质、音量、播放比率等参数。
SoundPool提供了一个构造器,该构造器可以指定它总共支持多少个声音、声音的品质、
SoundPool(int maxStreams, int streamType,int srcQuality):第一个参数指定支持多少个声音,第二个参数指定声音的类型,第三个参数指定声音的品质
一旦得到了SoundPool对象后,接下来就可调用SoundPool的多个重载的load方法来加载声音了,
1、 int load(Context context, int resId, int priority): 从resId所对应的资源加载声音
2、 int load(FileDescript fd, long offset, long length, int priority):加载fd 所对应的文件的offset开始,长度为length的声音
3、 int load(AssetFileDescriptior afd, int priority):从所对应的文件中加载声音
4、 int load(String path, int priotity):从path对应的文件中加载声音
上面四个方法中都有一个priotity参数,该参数目前还没有任何作用,Android建议设为1,保持和未来的兼容性
上面四个方法加载声音之后,都会返回改声音的ID,以后程序就可以通过该声音的ID来播放指定的声音,SoundPool提供下面方法播放声音:
int play(int sounded, float leftVolume,float rightVolume, int priotity, int loop, float rate):该方法的第一个参数指定播放哪个声音,leftVolume,rightVolume指定左右的音量,priority指定播放声音的优先级,数值越大,优先级越高。Loop指定是否循环,0为不循环,-1为循环;rate指定播放的比率,数值可以从0.5到2,1为正常比率
为了更好的管理SoundPool所加载的每一声音ID,程序一般会使用一个HashMap<Integer,Integer>对象来管理声音
归纳起来,使用SoundPool播放声音的步骤如下:
1、 调用SoundPool的构造器创建SoundPool的对象
2、 调用SoundPool对象的load()方法从指定资源、文件中加载声音。最好用HashMap<Integer,Integer>来管理所加载的声音
3、 调用SoundPool的play方法播放声音
构造方法
构造方法 | 描述 |
public SoundPool (int maxStreams, int streamType, int srcQuality)
| 参数说明: maxStreams:指定支持多少个文件 streamType:指定声音类型 srcQuality:声音品质 |
常用方法
方法名称 | 描述 |
public int load (Context context, int resId, int priority) | 从资源ID所对应的资源加载声音 |
public int load (AssetFileDescriptor afd, int priority) | 从原始资源文件中加载声音 |
public int load (FileDescriptor fd, long offset, long length, int priority) | 从原始资源文件中加载声音并设置加载从哪开始到多长的声音文件 |
public int load (String path, int priority) | 从指定文件路径加载声音 |
public final void pause (int streamID) | 暂停 |
public final int play (int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) | 播放 参数说明: soundID:资源ID leftVolume:左频道声音 rightVolume:右频道声音 loop:-1代表循环,0代表不循环 rate:值0.5-2.0设置1为正常 |
public final void release () | 释放SoundPool对象资源 |
public final void stop (int streamID) | 停止 |
public void setOnLoadCompleteListener (SoundPool.OnLoadCompleteListener listener) | 设置监听器,在加载音乐文件完成时触发该事件 |
注意事项:
1、SoundPool最大只能申请1M的内存空间;
2、音频格式建议使用OGG格式;
3、SoundPool提供了pause和stop方法,但这些方法建议最好不要轻易使用,有时会出现异常,而且不会立即中止播放声音,而是把缓冲区里的数据播放完才会停下来;
4、SoundPool目前只对16bit的WAV文件有较好的支持
5、一般在onCreate()函数里面加载,要是在用到的时候加载,要设置监听回调函数setOnLoadCompleteListener(SoundPool.OnLoadCompleteListener listener);确保音频文件加载初始化完毕,否则会出现SoundPool sample 1 not ready错误
技术历程:(参考http://www.linuxidc.com/Linux/2012-07/65391.htm、http://blog.csdn.net/jiahui524/article/details/7061538)