今天在一部Android设备上测试时发现,在播放按键的声音时,有时只播放了一部分声音,剩下的就不播了,其间也没有其他的音频插队进入播放。这里利用了MediaPlayer。
后来查资料发现,MediaPlayer不是太适合播放只有一两秒的短音频,有时会加载不完全,便会出现声音只播了一部分,另一部分无法播放的情况发生。
如果是播放一些短音乐,时长小于5秒的,建议使用SoundPool进行播放。
下面把MediaPlayer和SoundPool的例子都贴出来,方便日后查阅吧
先来看MediaPlayer例子:
public static void playVoice(Context context, int id){
MediaPlayer mPlayer = MediaPlayer.create(context, voice_language[LanguageUtils.isZh(context)][id]);
try{
mPlayer.prepare();
if(mPlayer.isPlaying()){
mPlayer.stop();
mPlayer.release();
mPlayer = MediaPlayer.create(context, voice_language[LanguageUtils.isZh(context)][id]);
}
}catch (IllegalStateException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
mPlayer.start();
}
上面的voice_language[LanguageUtils.isZh(context)][id]是我获取raw里音频的方法,主要逻辑就是根据不同语言进行不同的声音设置
然后是SoundPool例子,首先需要初始化,将程序运行过程中要用的声音,都Load:
private SoundPool mSoundPool = null;
private HashMap<Integer,Integer> soundIds;
/**
* 初始化语音工作
*/
public void initRes(){
SoundPool.Builder spb = new SoundPool.Builder();
spb.setMaxStreams(5);
spb.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.build()); //转换音频格式
mSoundPool = spb.build(); //创建SoundPool对象
if (mSoundPool != null){
soundIds = new HashMap<>();
soundIds.put(0, mSoundPool.load(MyApplication.context,voice_language[LanguageUtils.isZh(MyApplication.context)][0],1));
soundIds.put(1, mSoundPool.load(MyApplication.context,voice_language[LanguageUtils.isZh(MyApplication.context)][1],1));
soundIds.put(2, mSoundPool.load(MyApplication.context,voice_language[LanguageUtils.isZh(MyApplication.context)][2],1));
soundIds.put(3, mSoundPool.load(MyApplication.context,voice_language[LanguageUtils.isZh(MyApplication.context)][3],1));
soundIds.put(4, mSoundPool.load(MyApplication.context,voice_language[LanguageUtils.isZh(MyApplication.context)][4],1));
soundIds.put(5, mSoundPool.load(MyApplication.context,voice_language[LanguageUtils.isZh(MyApplication.context)][5],1));
}
}
接着在需要播放的地方调用play()方法就行了。下面的id就是执行了Load方法返回的值
mSoundPool.play(soundIds.get(id), 1f, 1f, 0, 0, 1.0f);