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):第一个参数指定支持多少个声音;第二个参数指定声音类型:第三个参数指定声音品质。

一旦得到了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来播放音效。

程序代码如下:


public
class SoundPoolDemo
extends Activity {

Button btn1,btn2,btn3;

//创建一个SoundPool对象

SoundPool soundPool;

//定义一个HashMap用于存放音频流的ID

HashMap<Integer, Integer>musicId=new
HashMap<Integer, Integer>();

@Override

protected
void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.mian);

btn1=(Button)findViewById(R.id.btn1);

btn2=(Button)findViewById(R.id.btn2);

btn3=(Button)findViewById(R.id.btn3);

//初始化soundPool,设置可容纳12个音频流,音频流的质量为5,

soundPool=new
SoundPool(12, 0,5);

//通过load方法加载指定音频流,并将返回的音频ID放入musicId中

musicId.put(1,
soundPool.load(this,
R.raw.awooga, 1));

musicId.put(2,
soundPool.load(this,
R.raw.evillaugh, 1));

musicId.put(3,
soundPool.load(this,
R.raw.jackinthebox, 1));

OnClickListener listener=new OnClickListener() {

@Override

public
void onClick(View v) {

//
TODO Auto-generated method stub

switch (v.getId()) {

case R.id.btn1:

//播放指定的音频流

soundPool.play(musicId.get(1),1,1,
0, 0, 1);

break;

case R.id.btn2:

soundPool.play(musicId.get(2),1,1,
0, 0, 1);

break;

case R.id.btn3:

soundPool.play(musicId.get(3),1,1,
0, 0, 1);

break;

default:

break;

}

}

};

btn1.setOnClickListener(listener);

btn2.setOnClickListener(listener);

btn3.setOnClickListener(listener);

}

}

程序运行效果图:

实际使用SoundPool播放声音时需要注意如下几点:

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

虽然SoundPool比MediaPlayer的效果好,但也不是绝对不存在延迟问题,尤其在那些性能不太好的手机中,SoundPool的延迟问题会更严重。

Android开发之SoundPool使用详解,布布扣,bubuko.com

时间: 2024-10-12 07:59:16

Android开发之SoundPool使用详解的相关文章

Android开发之Html类详解

在进行Android开发中经常回忽略Html类.这个类其实很简单,就是将HTML标签文本解析成普通的样式文本.下面就让我么看一下这个类的具体介绍. 类结构: java.lang.Object    ? android.text.Html 类概述: 这个类用于处理的HTML字符串并将其转换成可显示的样式文本.但并不是所有的HTML标记的支持. 公有方法: 说其简单是应为它就有四个方法: Public Methods static String escapeHtml(CharSequence tex

Android开发之SQLite数据库详解

Android开发之SQLite数据库详解 请尊重他人的劳动成果,转载请注明出处:Android开发之SQLite数据库详解 http://blog.csdn.net/fengyuzhengfan/article/details/40194393 Android系统集成了一个轻量级的数据库:SQLite, SQLite并不想成为像Oracle.MySQL那样的专业数据库.SQLite只是一个嵌入式的数据库引擎,专门适用于资源有限的设备上(如手机.PDA等)适量数据存取. 虽然SQLite支持绝大

Android开发之MediaRecorder类详解

MediaRecorder类详解 手机一般都有麦克风和摄像头,而Android系统就可以利用这些硬件来录制音视频了. 为了增加对录制音视频的支持,Android系统提供了一个MediaRecorder的类.该类的使用也非常简单,下面让我们来了解一下这个类: 一.类结构: java.lang.Object    ? android.media.MediaRecorder 二.类概述: 用于录制音频和视频的一个类. 三.状态图: 说明: 与MediaPlayer类非常相似MediaRecorder也

Android开发之EditText属性详解

1.EditText输入的文字为密码形式的设置 (1)通过.xml里设置: 把该EditText设为:android:password="true" // 以"."形式显示文本 (2)在代码里设置: 通过设置EditText的setTransformationMethod()方法来实现隐藏密码或这显示密码. editText.setTransformationMethod(PasswordTransformationMethod.getInstance());//设

【转】 Android开发之EditText属性详解

原文网址:http://blog.csdn.net/qq435757399/article/details/7947862 1.EditText输入的文字为密码形式的设置 (1)通过.xml里设置: 把该EditText设为:android:password="true" // 以”.”形式显示文本 (2)在代码里设置: 通过设置EditText的setTransformationMethod()方法来实现隐藏密码或这显示密码. editText.setTransformationMe

Android开发之Service服务详解

服务,作为Android四大组件之一,必然是重点.我们今天就来讲解一下有关服务的生命周期.两种开启方式以及相关用法. 服务有两种开启方式,一种是正常开启, 一种是以绑定的方式开启,当然,这两种方式可以组成混合开启. 一.服务的正常开启 正常开启服务的方法非常简单,我们先看如何定义一个服务 1.编写一个类,继承Service类. 我们先不管代码中的binder类.那个后续讲解用. public class TestService extends Service { @Override public

android开发之onCreate( )方法详解

onCreate( )方法是android应用程序中最常见的方法之一,那么,我们在使用onCreate()方法的时候应该注意哪些问题呢? 先看看Google Android Developers官网上的解释: onCreate(Bundle) is where you initialize your activity. Most importantly, here you will usually call setContentView(int) with a layout resource d

android开发之PreferenceScreen使用详解

是在惭愧,学习android也有一段时间了,今天才是第一次接触PreferenceScreen.记录下来,与大家分享. 本文参考:http://lovezhou.iteye.com/blog/1020361 PreferenceScreen使用步骤: 1.先在res文件夹中新建一个xml文件夹,用来存放preferences.xml文件 preferences.xml <?xml version="1.0" encoding="utf-8"?> <

android开发之Parcelable使用详解

想要在两个activity之间传递对象,那么这个对象必须序列化,android中序列化一个对象有两种方式,一种是实现Serializable接口,这个非常简单,只需要声明一下就可以了,不痛不痒.但是android中还有一种特有的序列化方法,那就是实现Parcelable接口,使用这种方式来序列化的效率要高于实现Serializable接口.不过Serializable接口实在是太方便了,因此在某些情况下实现这个接口还是非常不错的选择. 使用Parcelable步骤: 1.实现Parcelable