1、最近使用Android的SoundPool进行多个语音提示的播放时遇到问题,最开始使用wav格式的声音,有的机器上可以播放有的不行,原因是该控件对于ogg,MP3,wav格式支持不是很好,后来换用mp3并且进行提前加载测试没有问题
2、首先可以使用迅捷文字转换语音工具得到短语音,格式wav和MP3。然后在Application进行工具类的装在语音保证装在完成,然后在onLoadComplete中进行对应的语音使用map进行对应存储,使用时使用map播放对应的语音id。并实现播放当前语音时停止播放前一个语音,防止声音重叠。下面是部分代码
if (soundsPool == null) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
AudioAttributes audioAttributes = null;
audioAttributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build();
soundsPool = new SoundPool.Builder()
.setMaxStreams(16)
.setAudioAttributes(audioAttributes)
.build();
} else { // 5.0 以前
soundsPool = new SoundPool(16, AudioManager.STREAM_MUSIC, 0); // 创建SoundPool
}
}
soundsPool.load(context.getApplicationContext(), R.raw.raw_start, 1);
soundsPool.load(context.getApplicationContext(), R.raw.special_sound, 1);
soundsPool.load(context.getApplicationContext(), R.raw.raw_last_ten, 1);
soundsPool.load(context.getApplicationContext(), R.raw.order_end, 1);
soundsPool.setOnLoadCompleteListener((soundPool, sampleId, status) -> {
Log.e(TAG, "onLoadComplete: " + sampleId + "..sttus:" + status);
// soundPool.play(sampleId, 1, 1, 0, 0, 1);
if (sampleId == 1) {
soundMap.put(START, sampleId);
} else if (sampleId == 2) {
soundMap.put(SPECIAL, sampleId);
} else if (sampleId == 3) {
soundMap.put(LAST_TEN, sampleId);
} else if (sampleId == 4) {
soundMap.put(END, sampleId);
}
if (myOnLoadComplete != null) {
myOnLoadComplete.onLoadComplete(soundPool, sampleId, status);
}
});
关键代码和步骤已经贴出,如果有帮助可以点个赞,如果还不会可以找我要源码。并欢迎指正,讨论
网友评论