SoundPool控件

来源:互联网 发布:it创业项目 编辑:程序博客网 时间:2024/06/16 13:27

上一篇文章之中提到了Mediaplyer来播放音频。但是Mediaplyer有很多不足之处,

文章地址:http://blog.csdn.net/bobo8945510/article/details/52231162

Mediaplyer的缺点:
--》资源占用量较高,延迟时间较长。
--》不支持多个音频同事播放

那好吧,这一章咱们来看看SoundPool控件(
SoundPool主要用于播放一些较短的声音片段,与Mediaplyer比较,SoundPool的优势在于CPU资源占用量低和反映延迟小。
SoundPool提供了一个构造器,该构造器可以指定它共支持多少个声音(也就是池的大小),声音的品质等。构造器如下:

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


一旦得到了SoundPool对象之后,下面可以调用SoundPool的多个重载的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个load方法中有一个priprity参数,该参数目前没有任何作用,,Android 建议将该参数设置为1.保持和未来的兼容性。

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


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


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

使用SoundPool播放声音步骤如下


1、调用SoundPool的构造器创建SoundPool的对象。
2、调用SoundPool对象的load()方法从指定资源、文件中加载声音,最好使用HashMap<>来管理所加载的声音。
3、调用SoundPool的play方法播放声音

代码图片如下



实际使用SoundPool播放声音时有如下几点需要注意,SoundPool虽然可以一次性加载多个声音,但是由于内存限制,因此应该避免使用SoundPool来播放歌曲或者做游戏背景音乐,只有那些短促、密集的声音才考虑使SoundPool进行播放。

虽然SoundPool比MediaPlayer的效率好,但也不是绝对不存在餐延迟问题,尤其那些不好的手机中。SoundPool的延迟问题会很严重。
0 0