其实也不能算坑,只是自己还没认识到的规律。
我有一段程序需要使用soundPool.play播放一段音频,当播放间隔时长较大时,一切正常,但是间隔较小时就出问题了,会出现哑掉的情况,该它响的时候它不响。网上也没有人提相同的问题,解决问题有时就是这样,靠突出奇想、靠猜测,我先看了soundPool下都有哪些函数,看到有个stop函数,我想这是干什么用的呢,就尝试在每次播放一小段时间后调用下stop,然后问题就解决了。
通过调用stop函数解决问题,我猜测,使用soundPool播放音频时,如果一遍没播放完,是不能播放下一遍的。我之前的问题是由于,当播放间隔较小的,这个间隔恰好和音频时长相近,再加上soundPool.play这个函数有个二十毫秒左右的延时,所以就导致了发声的不稳定。
下面是我的代码,播放150毫秒后,就停止
// 下面这一句大概造成20毫秒左右的延时
int streamId = soundPool.play(soundId, 1, 1, 0, 0, 1.0f);
Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
soundPool.stop(streamId);
}
};
timer.schedule(timerTask, 150);
另外还有一个小坑,使用soundPool播放音频默认是使用的铃声音量,这给用户造成了不变,一会要调媒体音量,一会要调铃声音量,很多用户根本不知道现在的手机有多种音量类型。起初我以为这是soundPool默认的机制,后来才知道是可以设置的,代码如下:
AudioAttributes audioAttributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA) //当用途为媒体(如音乐或电影配乐)时要使用的用途值,如果不设置这个属性,则使用铃声音量进行播放
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build();
soundPool = new SoundPool.Builder()
.setMaxStreams(1)
.setAudioAttributes(audioAttributes)
.build();