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 来播放音效。
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);