SoundPool简介


Android 中除了 MediaPlayer 播放音频之外还提供了 SoundPool 来播放音效, SoundPool 使用音效池的概念来管理多个短促的音效,例如它可以开始就加载 20 个音效,以后在程序中按音效的 ID 进行播放。
一、SoundPool的特点


SoundPool 主要用于播放一些较短的声音片段,与 MediaPlayer 相比, SoundPool 的优势在于 CPU 资源占用量低和反应延迟小。另外, SoundPool 还支持自行设置声音的品质、音量、 播放比率等参数。


SoundPool 提供了一个构造器, 该构造器可以指定它总共支持多少个声音(也就是池的大小)、声音的品质等。构造器如下 :


SoundPool(int maxStreams, int streamType, int srcQuality) :第一个参数指定支持多少个声音;第二个参数指定声音类型:第三个参数指定声音品质。


二、SoundPool的初始化
一旦得到了 SoundPool 对象之后,接下来就可调用 SoundPool 的多个重载的 load 方法来加载声音了 。


SoundPool 提供了如下 4 个 load 方法:


int load(Context context, int resld, int priority) :从 resld 所对应的资源加载声音。


int load(FileDescriptor fd, long offset, long length, int priority ) :加载 fd 所对应的文件的 offset 开始、长度为 length 的声音。


int load(AssetFileDescriptor afd, int priority) :从 afd 所对应的文件中加载声音。


int load(String path, int priority ) :从 path 对应的文件去加载声音。


上面 4 个方法中都有一个 priority 参数,该参数目前还没有任何作用, Android 建议将该 参数设为 1 ,保持和未来的兼容性。


上面 4 个方法加载声音之后,都会返回该声音的的 ID ,以后程序就可以通过该声音的 ID 来播放指定声音。




三、SoundPool播放指定声音的方法:


int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) :该方法的第一个参数指定播放哪个声音; leftVolume 、 rightVolume 指定左、右的音量: priority 指定播放声音的优先级,数值越大,优先级越高; loop 指定是否循环, 0 为不循环, -1 为循环; rate 指定播放的比率,数值可从 0.5 到 2 , 1 为正常比率。


为了更好地管理 SoundPool 所加载的每个声音的 1D ,程序一般会使用一个 HashMap<Integer , Integer> 对象来管理声音。


归纳起来,使用 SoundPool 播放声音的步骤如下:


1、调用 SoundPool 的构造器创建 SoundPool 的对象。


2、调用 SoundPool 对象的 load() 方法从指定资源、文件中加载声音。最好使用 HashMap< Integer, Integer> 来管理所加载的声音。


3、调用 SoundPool 的 play 方法播放声音。


下面的程序示范了如何使用 SoundPool 来播放音效。


程序代码如下:

//声明变量     SoundPool mSoundPool;     //播放动作声音id         int mPlaySound;         //停止动作播放声音id         int mPauseSound;         //实例化SoundPool     mSoundPool = new SoundPool(5, AudioManager.STREAM_SYSTEM, 5);     //初始化播放动作音频         mPlaySound = mSoundPool.load("/system/media/audio/ui/SoundRecorderPlay.ogg", 1);         //初始化停止播放动作音频         mPauseSound = mSoundPool.load("/system/media/audio/ui/SoundRecorderPause.ogg", 1);                  //播放 播放动作音频         mSoundPool.play(mPlaySound, 1.0f, 1.0f, 0, 0, 1);         //播放 停止播放动作音频         mSoundPool.play(mPauseSound, 1.0f, 1.0f, 0, 0, 1);



更多相关文章

  1. Android的JNI_OnLoad简介与应用
  2. Android关于Dex拆分 MultiDex 技术详解
  3. Android之WebView篇
  4. Android(安卓)WebView 的使用(超详细用法)
  5. Android逆向之旅—Hook神器Frida使用详解
  6. Fresco的使用
  7. android 作适配
  8. Android的SoundPool类使用与利弊
  9. 2112-7-18 android切屏动画overridePendingTransition的应用

随机推荐

  1. MySQL单表数据不要超过500万行:是经验数值
  2. 面试过程中的失配与错位,大家怎么看?
  3. 汉诺塔问题
  4. WSL2:我在原生的Win10玩转Linux系统
  5. Spring Security 从问题到解决:谈踩坑、源
  6. 我是这么自学Java的
  7. 腐朽王朝的更迭:谈 SM 系统的技术升级和持
  8. 报表工具,买?自研?
  9. 讲给前端的正则表达式(3):使用 ES6 特性[
  10. 生活中,那至美