Android开发之SoundPool使用详解
使用SoundPool播放音效
如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:
1) 延时时间较长,且资源占用率高。
2) 不支持多个音频同时播放。
Android中除了MediaPlayer播放音频之外还提供了SoundPool来播放音效,SoundPool使用音效池的概念来管理多个短促的音效,例如它可以开始就加载20个音效,以后在程序中按音效的ID进行播放。
SoundPool主要用于播放一些较短的声音片段,与MediaPlayer相比,SoundPool的优势在于CPU资源占用量低和反应延迟小。另外,SoundPool还支持自行设置声音的品质、音量、 播放比率等参数。
SoundPool提供了一个构造器,该构造器可以指定它总共支持多少个声音(也就是池的大小)、声音的品质
构造器如下:
SoundPool(int maxStreams, int streamType, int srcQuality):第一个参数指定支持多少个声音;第二个参数指定声音类型:第三个参数指定声音品质。
int maxStreams:在声音池中允许同时存在的声音数量。当池子中的声音超过这个数量时,优先级(后面会提到)最低、或者最早(Oldest,原谅我可怜的翻译水平)放进池中的,将被移除。这个数值不是越大越好,因为越大也就意味着,Android会给你预分配一个更大的空间,如果不需要使用会造成浪费。
int streamType:声音流的类型,有STREAM_RING、STREAM_MUSIC等等,一般都是使用后者,即AudioManager.STREAM_MUSIC。
int srcQuality:官网解释为“采样速率转化器的质量”(再次原谅我的翻译),这个参数目前没有什么实际意义(可能还没实现这个功能),所以设置什么数值都无所谓,官方建议用0;
例:
public SoundPool luozisound = new SoundPool(5, AudioManager.STREAM_SYSTEM, 0);
一旦得到了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,保持和未来的兼容性。
一般来说用第一个,
Context context:这个不必多解释,一般都是设置为getApplicationContext()获取
int resId:想要加载的音效资源ID,我用的是R.raw.XXX
int priority:音效播放时的优先级,官方解释这个参数在这个方法中不起作用,建议用1暂时代替
例:
luozisound.load(getContext(), R.raw.luozi, 1);//加载音效文件资源
上面4个方法加载声音之后,都会返回该声音的的ID,以后程序就可以通过该声音的ID 来播放指定声音。
SoundPool提供的播放指定声音的方法:
int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate);
soundID指定播放哪个声音;
float leftVolume:左声道音量大小,这是一个相对值,大小在0.0f - 1.0f之间,具体计算方法为:你想要的声音大小 / 最大音量,比如取值0.8f表示最大音量的80%
float rightVolume:右声道音量大小,具体如上
int priority:优先级,值越大优先级越高,0的优先级最低。之前在第3步中也有一个优先级参数,但是那里无效,而现在这里的这个参数是正儿八经有效果的。
int loop:是否需要循环播放,取值不限。其中负数表示无穷循环(官方建议,如果无穷循环,用-1,当然-2、-3等也行),非负数表示循环次数,比如0表示循环0次,也就是播放一次就不再循环了,总共就只播放一次;1则表示循环1次(总共播放2次)。
float rate:这个参数有点意思,可以理解为播放速率(就是快进、快退啥的),取值0.5f - 2.0f,其中0.5表示播放速度为正常的0.5倍。1表示正常速率播放
例:
luozisound.play(1,1, 1, 0, 0, 1);
在load声音资源后,并不能立即调用play,否则无法播放声音,因为声音资源还没加载完成,应该给足够时间让它加载完成,比如在onCreate中load,在onclick中play
为了更好地管理SoundPool所加载的每个声音的1D,程序一般会使用一个HashMap对象来管理声音。
HashMap用到,我在补充
Android开发之SoundPool使用详解的更多相关文章
- [置顶] Android开发之MediaPlayerService服务详解(一)
前面一节我们分析了Binder通信相关的两个重要类:ProcessState 和 IPCThreadState.ProcessState负责打开Binder 驱动,每个进程只有一个.而 IPCThre ...
- Android开发之EditText属性详解
1.EditText输入的文字为密码形式的设置 (1)通过.xml里设置: 把该EditText设为:android:password="true" // 以”.”形式显示文本 ( ...
- 【转】 Android开发之EditText属性详解
原文网址:http://blog.csdn.net/qq435757399/article/details/7947862 1.EditText输入的文字为密码形式的设置 (1)通过.xml里设置: ...
- android开发之onCreate( )方法详解
这里我们只关注一句话:This is where you should do all of your normal static set up.其中我们只关注normal static,normal: ...
- Android开发之MediaRecorder类详解
MediaRecorder类介绍: MediaRecorder类是Android sdk提供的一个专门用于音视频录制,一般利用手机麦克风采集音频,摄像头采集图片信息. MediaRecorder主要函 ...
- android开发之Parcelable使用详解
想要在两个activity之间传递对象,那么这个对象必须序列化,android中序列化一个对象有两种方式,一种是实现Serializable接口,这个非常简单,只需要声明一下就可以了,不痛不痒.但是a ...
- android开发之PreferenceScreen使用详解
是在惭愧,学习android也有一段时间了,今天才是第一次接触PreferenceScreen.记录下来,与大家分享. 本文参考:http://lovezhou.iteye.com/blog/1020 ...
- Android开发之SoundPool使用具体解释
使用SoundPool播放音效 假设应用程序常常播放密集.急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了.由于MediaPlayer存在例如以下缺点: 1) ...
- NDK开发之JNIEnv参数详解
即使我们Java层的函数没有参数,原生方法还是自带了两个参数,其中第一个参数就是JNIEnv. 如下: native方法: public native String stringFromC(); pu ...
随机推荐
- 工程经验总结之吹水"管理大境界"
1.个人认为项目管理最核心的能力是预见风险和快速解决风险的能力. 从实践来看,没有百分百的完美计划,任何计划都有出现偏差的可能,或者说计划总是不会按照最初的设定去完美执行的. 项目经理存在的主要价值就 ...
- Spring Boot 使用Redis缓存
本文示例源码,请看这里 Spring Cache的官方文档,请看这里 缓存存储 Spring 提供了很多缓存管理器,例如: SimpleCacheManager EhCacheCacheManager ...
- java 变量和常量
通常情况下,为了方便物品的存储,我们会规定每个盒子可以存放的物品种类,就好比在"放臭袜子的盒子"里我们是不会放"面包"的!同理,变量的存储也讲究"分门 ...
- 【转载】java InputStream读取数据问题
原文链接:http://www.cnblogs.com/MyFavorite/archive/2010/10/19/1855758.html 1. 关于InputStream.read() 在 ...
- NOIP模拟:能源(二分答案)
题目描述 小美为了拯救世界能源危机,她准备了 n 台蓄电池.一开始每台蓄电池有 ai 个单位的能量. 现在她想把 n 台蓄电池调整到能量相同.对于每台蓄电池可以给另一台蓄电池传递能量.但是会有能量损耗 ...
- Java 9 揭秘(15. 增强的弃用注解)
Tips 做一个终身学习的人. 主要介绍以下内容: 如何弃用API @deprecate Javadoc标签和@Deprecation注解在弃用的API中的角色 用于生成弃用警告的详细规则 在JDK ...
- 走进安卓的重灾区----video
html5的video已经出来很久了.在ios上使用基本上没什么毛病,但是安卓下就是一个重灾区了,各种体验差.这几天搞了安卓的兼容,简直是要吐血.所以特意总结了一些强势的坑点. 先看一下常用的一些属性 ...
- vue怎么样创建组件呢??
我知道vue中核心就是组件,但是组件是什么呢?组件有什么用呢?怎么用组件呢?怎么样创建自己的组件呢? 前面两个问题就不说了,这里来说说,后面的两个问题: 1)创建自己的组件 通过vue.extend( ...
- C#中的数据类型转换
数据类型在一定的条件下是可以相互转换的,如将int型数据转换成double型数据.C#允许使用两种转换方式:隐式转换和显式转换. 1.隐式转换 隐式转换:从类型A到类型B的转换可以在所有情况下进行,执 ...
- 感知器算法--python实现
写在前面: 参考: 1 <统计学习方法>第二章感知机[感知机的概念.误分类的判断] http://pan.baidu.com/s/1hrTscza 2 点到面的距离 3 梯度 ...