[android] SoundPool详解
时间:2015-05-26 21:34:49
收藏:0
阅读:341
今天做一个小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)停止播放
......
原文:http://blog.csdn.net/bless2015/article/details/46010759
评论(0)