前言
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
本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/14120665.html
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。