播放短音乐播到一半突然无声音的问题

今天在一部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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值