pop项目之SoundPool

据非官方解释,

如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:

1) 延时时间较长,且资源占用率高。

2) 不支持多个音频同时播放。

Android中除了MediaPlayer播放音频之外还提供了SoundPool来播放音效,SoundPool使用音效池的概念来管理多个短促的音效,例如它可以开始就加载20个音效,以后在程序中按音效的ID进行播放。

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

我觉得SoundPool使用起来很方便。

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对应的文件去加载声音。

为了更好地管理SoundPool所加载的每个声音的1D,程序一般会使用一个HashMap对象来管理声音。

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

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

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

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

下面看看一个实例吧,pop项目里面的。

package cn.edu.bztc.pop;

import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.View;

public class SoundStuff extends Activity implements View.OnClickListener,View.OnLongClickListener{
	//爆炸声(点击)
	SoundPool sp;
	int explosion=0;
	
	MediaPlayer mp;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		View v=new View(this);
		setContentView(v);
		v.setOnClickListener(this);
		v.setOnLongClickListener(this);
		
		sp=new SoundPool(5,AudioManager.STREAM_MUSIC,0);
		explosion=sp.load(this, R.raw.explosion, 1);
		
		mp=MediaPlayer.create(SoundStuff.this, R.raw.aliee);
		
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		if(explosion!=0){
		sp.play(explosion, 1,1, 0, 0, 1);
		}
	}

	@Override
	public boolean onLongClick(View v) {
		// TODO Auto-generated method stub
		mp.start();
		return false;
	} 

}

注意:

1. SoundPool最大只能申请1M的内存空间,这就意味着我们只能用一些很短的声音片段,而不是用它来播放歌 曲或者做游戏背景音乐。


  2. SoundPool提供了pausestop方法,但这些方法建议最好不要轻易使用,因为有些时候它们可能会使你的程序莫名其妙的终止。Android开发网建议使用这两个方法的时候尽可能多做测试工作,还有些朋友反映它们不会立即中止播放声音,而是把缓冲区里的数据播放完才会停下来,也许会多播放一秒钟。

  3. SoundPool的效率问题。其实SoundPool的效率在这些播放类中算是很好的了,这可能会影响用户体验。也许这不能管SoundPool本身,因为到了性能比较好的Droid中这个延迟就可以让人接受了。

其实很简单。的,。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值