使用SoundPool记录

上个月使用了一次SoundPool用来仿一款背单词app,最近突然想起来,还是趁现在记得,赶紧记下来

1.首先先创建一个SoundPool的实例:

SoundPool soundPool = new SoundPool.Builder().setMaxStreams(1).build();
//.setMaxStreams(1)代表最大可同时播放几个音频流,我这设置的是1
//还有个.setAudioAttributes(xxx)方法,说实话我也不知道有什么鸟用,网上也查不到,反正我没设置它

2.加载音频资源

soundPool.load(wordFile.toString(), 1); //从文件加载音频
//第一个参数是文件的位置,用字符串表示
//第二个参数我就日了狗了,官方文档中注明: the priority of the sound. Currently has no effect.Use a value of 1 for future compatibility.
//妈的,没用你特么设计这个参数干毛!,不管怎么样,我们传入1就好

public int load(Context context, int resId, int priority)   //这个是从资源文件中加载音频,我没使用,看起来蛮简单的

3.播放音频文件

public final int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
//第一个参数soundID         就是我们加载完文件(load方法)时返回的int型数字,必须填加载过的数字
//第二个参数leftVolume      左声道音量
//第三个参数rightVolume     右声道音量
//第四个参数priority        播放声音的优先级
//第五个参数loop            声音重复的次数, 0代表不循环, -1代表无限循环
//第六个参数rate            声音播放的速度, 1.0代表正常速度, 取值范围为0.5~2.0  //这个不错哦
//返回值        如果是个非0的值代表播放成功,如果0代表播放失败

/** 翻译下这个方法的部分官方说明:
*   |   播放指定soundID的声音,这个soundID是load()方法返回的值
*   |   play()方法返回值如果是非0的值表示播放成功,如果是0表示失败,这个值可以用做重放
*   |   注意:   如果正在播放的声音数超过了播放的最大限制数,使用play()方法可能造成另一个声音被停止
*   |   
*   |   loop值如果为0表示只播放一次,如果-1表示无限重复,如果是其他值表示重复的次数
*   |   例如:   loop = 0, 正常播放1次, 重复0次, 总共播放一次
*   |           loop = 1, 正常播放1次, 重复1次, 总共播放2次
*   |           loop = 99, 正常播放1次, 重复99次, 总共播放100次
*/


4.释放资源

(1)释放指定资源:

public native final boolean unload(int soundID);
//指定soundID的声音资源将不能再使用

(2)释放所有资源:

public final void release()
//释放加载的所有资源,释放后就不能再播放了,而且应该将SoundPool的引用设为null

5.使用心得:

我想了想还是有必要要传授给大家一点人生经验

1.如果加载的资源太多了,超过了SoundPool的内存限制(具体多少我不是很清楚,但网上都说是1M),那么最先加载的资源将不再可用. 就像一个队列的数据结构一样,先进先出.

2.如果资源文件不多,但需要重复播放

//这种情况可以用一个map将load()得到的soundID保存下来,以便下次使用,例如:
Map map = new HashMap()
int soundID = soundPool.load(wordFile.toString(), 1);
String key = "打飞机的声音"
map.put(key, soundID);

//这样可以重复利用已经加载过的声音资源

3.如果资源很多,每个声音播放的次数很少

//这种情况换句话说就是,每个资源加载一次就不再使用了,那么只需要在加载的时候播放就行
使用SoundPool.OnLoadCompleteListener,在加载成功后的回调中播放就行

/**
 * Called when a sound has completed loading.
 *
 * @param soundPool SoundPool object from the load() method
 * @param sampleId the sample ID of the sound loaded.
 * @param status the status of the load operation (0 = success)
 */
public void onLoadComplete(SoundPool soundPool, int sampleId, int status);

//上面的参数中sampleId,就是加载资源的soundID.
//在这个方法中使用play()方法就行

@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
    soundPool.play(sampleId, 1, 1, 1, 0, 1);
}

以上

你可能感兴趣的:(使用SoundPool记录)