SoundPool播放音效

原创 2016年08月29日 20:10:03

强调!!!以下只是我个人看法,如有错误的地方请文明指出微笑,如有其他看法请耐心讨论微笑,如有看不懂可以参考其他有关博客微笑,最后如有想喷的出门左转不谢。微笑     

上次有提到用MediaPlayer来播放音频,但是要播放密集的,短促的音效还是用SoundPool好。主要是MediaPlayer资源占用率较高,延时时间较长,不支持多个音频同时出现。

      SoundPool使用了音效池的概念管理多个音效,它可以同时加载很多音效,然后根据音效的ID值进行播放。SoundPool的优势在于CPU资源占用量低,反应延迟小,另外SoundPool还支持自行设置声音的品质、音量、播放频率等参数。

       注:从Android5.0开始SoundPool的构造器被设置为过时,因此推荐使用SoundPool.Builder来创建SoundPool对象。

       获得了SoundPool对象后,接下来就可以调用SoundPool的多个重载的load()方法来加载声音了,返回值是int类型的id值。

int load(Context context, int resid, int priority):`从resid所对应的资源加载声音。

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

       注;上面四个方法中都有int priority的参数,该参数目前还没有任何作用,Android建议将该参数设置为1,保持和未来的兼容性。

       加载声音之后,要根据返回的id值来播放声音了,用到了SoundPool提供的Play()方法来播放指定的声音。

int play(int soundID,float leftVoiume,float rightVolume,int priority,int loop,float rate):该方法的第一个参数指定播放哪个声音,第二、三各参数指定播放的音量,priority指定播放声音的优先级,数值越大,优先级别越高;loop指定是否循环,0为不循环,-1为循环;rate指定播放的比率,数值可以从0.5到2,1为正常比率。

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

总之,使用SoundPool播放声音的步骤如下:

1、调用SoundPool.Builder的构造器创建SoundPool.Builder对象,并通过该Builder对象为SoundPool设置属性。

2、调用SoundPool的构造器创建SoundPool对象。

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

4、调用SoundPool的play()方法播放声音。

小例子(有三个按钮来播放声音):

import java.util.HashMap;

import android.app.Activity;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;

public class OtherActivity extends Activity {
	Button bomb,shot,arrow;
	//定义一个SoundPool
	SoundPool soundPool;
	HashMap<Integer,Integer> soundMap = new HashMap<>();
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_other);
		bomb = (Button) findViewById(R.id.bomb);
		shot = (Button) findViewById(R.id.shot);
		arrow = (Button) findViewById(R.id.arrow);
		AudioAttributes attr = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_GAME)//设置音效使用场景
				//设置音效的类型
				.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
				.build();
		soundPool = new SoundPool.Builder().setAudioAttributes(attr)//设置音效池的属性
				.setMaxStreams(10)//设置最多可容纳10个音频流
				.build();
		//load方法加载指定音频文件,并返回所加载的音频ID
		//此处使用HashMap来管理这些音频流
		soundMap.put(1,sounPool.load(this,R.raw.bomb,1));
		soundMap.put(2,sounPool.load(this,R.raw.shot,1));
		soundMap.put(3,sounPool.load(this,R.raw.arrow,1));
		bomb.setOnClickListener(this);
		shot.setOnClickListener(this);
		arrow.setOnClickListener(this);
	}
	//重写OnClickListener监听接口
	private void onClick(View source) {
		//判断哪个按钮被单击
		switch(source.getId()){
		case R.id.bomb:
			soundPool.play(soundMap.get(1), 1, 1, 0, 0, 1);
			break;
		case R.id.shot:
			soundPool.play(soundMap.get(2), 1, 1, 0, 0, 1);
			break;
		case R.id.arrow:
			soundPool.play(soundMap.get(3), 1, 1, 0, 0, 1);
			break;
		}
	}
}
实际上使用SoundPool播放声音是要注意以下几点:

SoundPool虽然可以一次加载多个声音,但由于内存限制,因此应该避免用SoundPool播放比较大的音频比如歌曲和游戏的背景音乐。

虽然SoundPool的效率比MediaPlayer好,但也不是绝对不存在延时问题,尤其是在那些性能不大好的手机上,SoundPool的延时会非常严重。

soundPool播放音效没声音的解决办法并据此研究如何提高音效声音

利用soundPool播放简短的音效是非常有用的,优点是它比mediaPlayer占用资源少,还可以同时播放多个音效等但是缺点就是对于音效的大小和持续时间等都有比较高的要求,据传音效的大小不能超过1M...
  • qiang_xi
  • qiang_xi
  • 2015年11月25日 14:22
  • 4014

Android使用SoundPool播放短音效

前言对于Android播放一些简短音效,例如提示音,或者铃声,相对于使用MediaPlayer,SoundPool可以节省更多资源,并且可以同时播放多个音效,而且可以针对不同音效设置不同播放品质实现S...
  • dazhaoDai
  • dazhaoDai
  • 2017年06月23日 17:45
  • 427

Android SoundPool.play方法的音量与系统音量的关系

Android SoundPool.play方法的音量与系统音量的关系是乘积关系
  • foruok
  • foruok
  • 2016年09月18日 22:52
  • 6771

Android 音频播放之SoundPool的使用和封装(自定义声音资源)

例如,现在在一个五子棋游戏中,我们需要在棋子落盘的时候播放一段声音。我们可以利用SoundPool,因为它时间很短,而且需要反复播放,并且我们不希望声音占用太大资源。一般大家使用的是MediaPlay...
  • huangxiaoguo1
  • huangxiaoguo1
  • 2016年12月21日 12:28
  • 1305

使用SoundPool播放音效

使用SoundPool播放音效本文档转载自 http://www.2cto.com/kf/201408/325318.html如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用Medi...
  • yc2011014265
  • yc2011014265
  • 2016年11月04日 20:39
  • 104

android开发笔记之多媒体—SoundPool(音效池)

使用SoundPool播放音效——如果应用程序经常需要播放密集,短促的音效。这时还用Mediaplayer就显得不合适。——MediaPlayer的缺点:资源占用量较高,延迟时间较长不支持多个音频同时...
  • qq_22063697
  • qq_22063697
  • 2016年05月15日 00:14
  • 741

使用SoundPool播放音效

MediaPlayer有两个缺陷:资源占用量较高、延迟时间较长。不支持多个音频同时播放。 所以如果程序需要播放密集、短促的音效,这时还用MediaPlayer就不合适了。应该使用SoundPool来播...
  • u010142437
  • u010142437
  • 2013年07月11日 20:00
  • 1936

Pro Android学习笔记(一二八):Media Frameworks(3):用SoundPool的音频播放

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处以及作者@恺风Wei。 MediaPlayer在一个时间只能处理一个音频或视频文件,如果我们需要同时播放多个音频文...
  • flowingflying
  • flowingflying
  • 2014年09月23日 21:49
  • 3007

android 游戏音效播放 SoundPool

游戏的音效由于比较特殊,
  • u013775102
  • u013775102
  • 2014年04月21日 17:30
  • 567

使用SoundPool 同时播放多个音频

MediaPlayer 是多媒体包的一个 基本工具,但它一次只能处理一个音频或 视频文件. 如果只有少量的音频要播放,并且想要快速的性能,SoundPool 类可提供帮助, 实际上在底层使用了 Med...
  • aduovip
  • aduovip
  • 2013年11月09日 19:43
  • 4377
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SoundPool播放音效
举报原因:
原因补充:

(最多只允许输入30个字)