Android SoundPool播放音频

Android SoundPool播放音频 一看就懂

MediaPlayer存在如下缺点:
1、  资源占用率较高,延迟时间较长
2、  不支持多个音频同时播放

而SoundPool使用音效池的概念来管理多个短促的音效,例如它可以开始就加载20个音效,以后在程序中按音效的ID进行播放

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

SoundPool提供了一个构造器,该构造器可以指定它总共支持多少个声音、声音的品质、

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

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

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

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

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

4、  int load(String path, int priotity):从path对应的文件中加载声音

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

上面四个方法加载声音之后,都会返回改声音的ID,以后程序就可以通过该声音的ID来播放指定的声音,SoundPool提供下面方法播放声音:

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

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

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

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

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

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

构造方法

构造方法

描述

public SoundPool (int maxStreams, int streamType, int srcQuality)

 

参数说明:

maxStreams:指定支持多少个文件

streamType:指定声音类型

srcQuality:声音品质

 

常用方法

方法名称

描述

public int load (Context context, int resId, int priority)

从资源ID所对应的资源加载声音

public int load (AssetFileDescriptor afd, int priority)

从原始资源文件中加载声音

public int load (FileDescriptor fd, long offset, long length, int priority)

从原始资源文件中加载声音并设置加载从哪开始到多长的声音文件

public int load (String path, int priority)

从指定文件路径加载声音

public final void pause (int streamID)

暂停

public final int play (int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)

播放

参数说明:

soundID:资源ID

leftVolume:左频道声音

rightVolume:右频道声音

loop:-1代表循环,0代表不循环

rate:值0.5-2.0设置1为正常

public final void release ()

释放SoundPool对象资源

public final void stop (int streamID)

停止

public void setOnLoadCompleteListener (SoundPool.OnLoadCompleteListener listener)

设置监听器,在加载音乐文件完成时触发该事件

 

注意事项:

1、SoundPool最大只能申请1M的内存空间;
2、音频格式建议使用OGG格式;
3、SoundPool提供了pause和stop方法,但这些方法建议最好不要轻易使用,有时会出现异常,而且不会立即中止播放声音,而是把缓冲区里的数据播放完才会停下来;
4、SoundPool目前只对16bit的WAV文件有较好的支持

5、一般在onCreate()函数里面加载,要是在用到的时候加载,要设置监听回调函数setOnLoadCompleteListener(SoundPool.OnLoadCompleteListener listener);确保音频文件加载初始化完毕,否则会出现SoundPool sample 1 not ready错误

技术历程:(参考http://www.linuxidc.com/Linux/2012-07/65391.htm、http://blog.csdn.net/jiahui524/article/details/7061538)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值