第六十四讲:Android之多媒体(Media)(二)

崇高的理想就象生长在高山上的鲜花。如果要搞下它,勤奋才能是攀登的绳索。


本讲内容:SoundPool类的使用

使用MediaPlayer类但该类占用资源较多,用soundpool可以播一些短的反应速度要求高的声音, 比如游戏中的爆破声。 相对于MediaPlayer类可以做到使用较少的CPU资源和较短的反应延迟。SoundPool和其他声音播放类相比,其特点是可以自行设置声音的品质、音量、播放比率等参等。并且它可以同时管理多个音频流,每个流都有独自的ID,对某个音频流的管理都是通过ID进行的。


1. SoundPool载入音乐文件使用了独立的线程,不会阻塞UI主线程的操作。但是这里如果音效文件过大没有载入完成,我们调用play方法时可能产生严重的后果,这里Android SDK提供了一个SoundPool.OnLoadCompleteListener类来帮助我们了解媒体文件是否载入完成,我们重载 onLoadComplete(SoundPool soundPool, int sampleId, int status) 方法即可获得。 
2. 从上面的onLoadComplete方法可以看出该类有很多参数,比如类似id,是的SoundPool在load时可以处理多个媒体一次初始化并放入内存中,这里效率比MediaPlayer高了很多。 
3. SoundPool类支持同时播放多个音效,这对于游戏来说是十分必要的,而MediaPlayer类是同步执行的只能一个文件一个文件的播放。 
4. SoundPool最大只能申请1M的内存空间,这就意味着我们只能用一些很短的声音片段,而不是用它来播放歌 曲或者做游戏背景音乐。

构造方法描述
public SoundPool (int maxStreams, int streamType, int srcQuality)
maxStream —— 同时播放的流的最大数量 
streamType —— 流的类型,一般为STREAM_MUSIC(具体在AudioManager类中列出) 
srcQuality —— 采样率转化质量,当前无效果,使用0作为默认值 

参数说明:

maxStreams:指定支持多少个文件

streamType:指定声音类型

srcQuality:声音品质


常见方法描述
public int load (Context context, int resId, int priority)从资源ID所对应的资源加载声音
ublic int load (AssetFileDescriptor afd, int priority)从原始资源文件中加载声音
ublic int load (FileDescriptor fd, long offset, long length, int priority)从原始资源文件中加载声音并设置加载从哪开始到多长的声音文件
public int load (String path, int priority)从指定文件路径加载声音
public final void pause (int streamID)暂停
public final int play (int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)

播放     参数说明:

soundID:资源ID          leftVolume:左频道声音

rightVolume:右频道声音   priority表示优先级

loop:-1代表循环,0代表不循环

rate:值0.5-2.0设置1为正常

public final void release ()释放SoundPool对象资源
public final void stop (int streamID)停止
public void setOnLoadCompleteListener (SoundPool.OnLoadCompleteListener listener)设置监听器,在加载音乐文件完成时触发该事件

一、使用步骤:

第一步:创建一个SoundPool 
SoundPool soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0); 
创建了一个最多支持3个流同时播放的,类型标记为音乐的SoundPool。 


第二步:一般把多个声音放到HashMap中去并用 soundpool的加载:

Map<Integer, Integer> soundMap = new HashMap<Integer, Integer>();

soundMap.put(1, soundPool.load(this, R.raw.apple, 1));
soundMap.put(2, soundPool.load(this, R.raw.apple, 1));

第三步:播放

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

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


下面通过一个例子

public class MainActivity extends Activity implements OnClickListener {
	private Button b1;
	private Button b2;
	private Button b3;
	
	private SoundPool soundPool;
	Map<Integer, Integer> soundMap = new HashMap<Integer, Integer>();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		b1 = (Button) findViewById(R.id.b1);
		b2 = (Button) findViewById(R.id.b2);
		b3 = (Button) findViewById(R.id.b3);
		b1.setOnClickListener(this);
		b2.setOnClickListener(this);
		b3.setOnClickListener(this);

		// 创建 SoundPool对象设置最多容纳5个音频。音频的品质为5
		soundPool = new SoundPool(5, AudioManager.STREAM_SYSTEM, 5);

		// load方法加载音频文件返回对应的ID
		soundMap.put(1, soundPool.load(this, R.raw.apple, 1));
		soundMap.put(2, soundPool.load(this, R.raw.apple, 1));
		soundMap.put(3, soundPool.load(this, R.raw.apple, 1));
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.b1:
			soundPool.play(soundMap.get(1), 1, 1, 1, 0, 1);
			break;
		case R.id.b2:
			soundPool.play(soundMap.get(2), 1, 1, 1, 0, 1);
			break;
		case R.id.b3:
			soundPool.play(soundMap.get(3), 1, 1, 1, 0, 1);
			break;
		}
	}
}


本讲就到这里,Take your time and enjoy it

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值