观心静

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

前言

  SoundPool 与 MediaPlayer的区别是,SoundPool可以多音轨播放声音,意思是可以多个声音同时播放。所以适合播放一些铃声与提示音。 避免重要的提示音会因为音轨被占用无法播放的问题。

 

创建SoundPool

        SoundPool mSoundPool = new SoundPool.Builder()
                .setMaxStreams(5)//设置同时播放流的数量
                .build();

在创建的时候设置播放音频的属性

        AudioAttributes audioAttributes = new AudioAttributes.Builder()
                .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) //设置音频类型
                .setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED) //设置音频的标识
                .setLegacyStreamType(AudioManager.STREAM_ALARM)     //设置传统流类型
                .setUsage(AudioAttributes.USAGE_ALARM)              //设置音频用途
                .build();
        SoundPool mSoundPool = new SoundPool.Builder()
                .setMaxStreams(5)
                .setAudioAttributes(audioAttributes)
                .build();

加载播放音频

有四种下载方式

  • public int load(String path, int priority)                                                  导入文件路径加载
  • public int load(Context context, int resId, int priority)                            导入raw资源加载
  • public int load(AssetFileDescriptor afd, int priority)                          从assets文件夹中加载
  • public int load(FileDescriptor fd, long offset, long length, int priority)    导入流加载

下面展现两种方式:

assets方式:

第二个参数 priority 为音频的优先级

        try {
            int mId = mSoundPool.load(getAssets().openFd("hi.mp3"),1);
        } catch (IOException e) {
            e.printStackTrace();
        }

raw方式:

        int mId = mSoundPool.load(this,R.raw.hi,1);

加载会返回一个sound ID,这个sound ID很重要,是后续播放音频需要使用的id

监听是否加载成功

请注意,执行加载是异步的过程。需要等待加载完成回调。如果不等待立即播放会导致播放失败。

        mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
            @Override
            public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {

            }
        });

取消加载音频

        boolean isUn = mSoundPool.unload(mId); //如果成功卸载会返回true,如果已经卸载过了会返回false

播放音频

之前加载获得的音频id在这里导入,另外这里的返回值streamID 也很重要,需要用来暂停或者恢复播放时导入

                /**
                 *  soundID     需要播放的soundID
                 *  leftVolume  左声道音量(范围 0.0到1.0)
                 *  rightVolume 右声道音量(范围 0.0到1.0)
                 *  priority 优先级,值越大优先级越高
                 *  loop 循环模式(0=无循环,-1=永久循环)
                 *  rate 播放速率(1.0=正常播放,范围0.5到2.0)
                 */
                int streamID = mSoundPool.play(mId,1,1,1, 0, 1.0f);
                //streamID返回值 播放失败等于0,播放成功非0

暂停播放

暂停指定id的音频

                mSoundPool.pause(streamID);

暂停全部音频

                mSoundPool.autoPause();

恢复播放

恢复指定id的音频

                mSoundPool.resume(streamID);

恢复全部音频

                mSoundPool.autoResume();

停止播放

                mSoundPool.stop(streamID);

其他API

                mSoundPool.setLoop(streamID, -1); //重新设置循环
                mSoundPool.setVolume(streamID, 1, 1);//重新设置声音大小
                mSoundPool.setRate(streamID, 1.0f);//重新设置播放速率
                mSoundPool.release(); //释放SoundPool的全部资源,并且这个SoundPool也将无法使用

 

 

End

posted on 2020-12-11 15:36  观心静  阅读(932)  评论(0编辑  收藏  举报