在Android系统中,可以使用SoundPool来播放一些短的、反应速度要求较高的声音,比如游戏中的爆破声。而MediaPlayer适合播放较长的音频。
1.主要特点
(1)SoundPool使用了独立的线程来载入音乐文件,不会阻塞UI主线程的操作。但是如果因为音效文件过大而没有载入完成,调用play()方法时可能会产生严重的后果。在Android SDK中提供了SoundPool.OnLoadCompleteListener类来帮助我们了解媒体文件是否载入完成通过使用重载方法onLoadComplete(SoundPool soundPool,int sampleId,int status)即可判断是否载入完成。
(2)方法onLoadComplete()有很多参数,SoundPool在加载时可以将多个媒体一次性初始化并放入内存中,效率比MediaPlayer高很多。
(3)SoundPool类支持同时播放多个音效,这对于游戏来说是十分必要的,而MediaPlayer类是同步执行,只能依次播放文件。
2.载入音效的方法
在SoundPool中存在如下4个载入音效的方法。
■ int load(Context context,int resId,int priority):从APK资源载入。
■ int load(FileDescriptor fd,long offset,long length,int priority):从FileDescriptor对象载入。
■ int load(AssetFileDescriptor afd,int priority):从Asset对象载入。
■ int load(String path,int priority):从完整文件路径名载入。
3.使用流程
1)可以使用SoundPool()方法创建一个SoundPool对象,此方法格式如下。
■ maxStream:同时播放的流的最大数量。
■ streamType:流的类型,一般为STREAM_MUSIC,具体在AudioManager类中列出
■ srcQuality:采样率转化质量,使用0作为默认值。
例如下面的代码创建了一个最多支持3个流同时播放的、类型标记为音乐的SoundPool
2)把多个声音放到HashMap中去,例如下面的代码(www.xing528.com)
3)接下来用下面的方法加载SoundPool
其中参数priority表示优先级。
4)使用方法play()来播放音频,其语法格式如下
■ leftVolume和rightVolume:表示左右音量。
■ priority:表示优先级。
■ loop:表示循环次数。
■ rate:表示速率,最低为0.5,最高为2,1代表正常速度
例如下面的代码:
使用pause(int streamID)方法停止播放,这里的streamID和soundID均在构造SoundPool类的第一个参数中指明了总数量,而id从0开始。
4.SoundPool的缺陷
(1)SoundPool最大只能申请1MB的内存空间,这就意味着我们只能用一些很短的声音片段,而不是用它来播放歌曲或者做游戏的背景音乐。
(2)SoundPool提供了pause和stop方法,但这些方法最好不要轻易使用,因为有些时候它们可能会使程序莫名其妙地终止。建议在使用这两个方法时,尽可能多做测试工作。
(3)SoundPool的效率问题。其实SoundPool的效率在这些播放类中算是很好的了,但是在G1中测试时有100ms左右的延迟,这可能会影响用户体验。但是这种延迟不是由SoundPool本身造成的,因为在性能比较好的Droid设备中测试时会发现这个延迟几乎没有了。
虽然在现阶段SoundPool有这些缺陷,但也有着它不可替代的优点。建议大家在如下情况中多使用SoundPool。
■ 应用程序中的声效,例如按键提示音和消息等。
■ 游戏中密集而短暂的声音,例如多个飞船同时爆炸。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。