当前位置: 代码迷 >> Android >> Android初学者日记 21音效- SoundPool
  详细解决方案

Android初学者日记 21音效- SoundPool

热度:23   发布时间:2016-05-01 19:06:55.0
Android菜鸟日记 21音效- SoundPool
Android菜鸟日记
21音效- SoundPool

关于音效:
音效是小于7秒的音频。
这一类时间段但是要求反应迅速的印象就不能使用播放时间较长的音乐播放技术了{比如mediaManager}

SoundPool
介绍:android系统中 用于管理和播放应用程序的声音资源。此类将音频加载到内存,故出于性能考虑:只有音效才使用此方法实现。

1.通过 new SoundPool()获得SoundPool对象
Ex: new SoundPool(int 最大音效数,int 音效类型,int音频文件质量)。

2.通过sp.load()加载音频。会返回此音频的序列号();根据load顺序返回。
此方法返回:int 为加载音效的soundID  [作为此音效的标示id].
soundID用于play方法,作为参数告知调用哪个被加载的音效。
建议使用hashMap <Integer,integer>来保存返回的数据。
这样可以把所有的音频文件集中在一起。[不适用也一样的]

3.通过sp.paly()来启动音频
sp.play(int 要启动的id, float 左声道音量, float 右声道音量, int 优先级, int 循环次数, int 回放速度);
int 循环次数:-1为 无限循环 0为不循环
rate 回放速度:0.5~2  1为正常
重点: play()  方法返回streamID  如果要存在需要暂停当前音效的行为的话,需要把此id保存下来[我一般是用hashmap] 不过音效一般不暂停,且每次的paly()返回的值递增,同样的东西被paly()多次,他们的strreamID是不一样的,且streamID不因播放完毕而减少。

既如果播放了199次,当播放200次时 即使前面的199次都结束了,低200次的id依旧是streamID=200;  另:streamID从1开始。


PS:左右声道音量可以通过系统获取
AudioManager am = (AudioManager) this
.getSystemService(this.AUDIO_SERVICE);
float maxv = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
// 获得stream 的最大音量 把系统音量传入 从而获得系统当前最大音量。
float currentv = am.getStreamVolume(AudioManager.STREAM_MUSIC);
// 获得当前音量



4.通过sp. Pause(int straemID)来暂停音频
其实这个不怎么用到,因为音效时间很短 很少需要暂停音效的。
真要用到就把把之前保存所有streamID的hashMap拿出来
然后用迭代器Iterator 迭代出所有的streamID
然后一一暂停
如下
public void funStop() {
Iterator it= spMaping.keySet().iterator();
while (it.hasNext()) {
Integer temp = (Integer)it.next();
Log.v("myTag", ""+temp);
sp.pause(temp);
}
}


代码:
SoundPoolActivityActivity.java
package com.lurencun.test;

import java.util.HashMap;
import java.util.Iterator;

import android.app.Activity;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class SoundPoolActivityActivity extends Activity {

private Button bt1 = null;
private Button bt2 = null;
private Button bt3 = null;
private Button bt4 = null;
private SoundPool sp = null;
private HashMap<Integer, Integer> spMap = null;
private HashMap<Integer, Integer> spMaping = new HashMap<Integer, Integer>();;

int i = 1;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.initSountPool();
bt1 = (Button) this.findViewById(R.id.bt1);
bt2 = (Button) this.findViewById(R.id.bt2);
bt3 = (Button) this.findViewById(R.id.bt3);
bt4 = (Button) this.findViewById(R.id.bt4);
}

public void funClick(View v) {
// 点击触发
int temp = v.getId();

switch (temp) {
case R.id.bt1:
playSound(1, 3);
break;
case R.id.bt2:
playSound(2, 3);
break;
case R.id.bt3:
funStop();
break;
case R.id.bt4:
sp.pause(spMap.get(2));
break;

}

}

public void initSountPool() {
// 初始化资源
sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
// 设置 soundpool(最大容纳音效数 音频类型 文件质量)
spMap = new HashMap<Integer, Integer>();
spMap.put(1, sp.load(this, R.raw.attack02, 1));
// sp.load加载音乐 (环境 ,音乐资源,优先级)
spMap.put(2, sp.load(this, R.raw.attack14, 1));
// Log.v("myTag", ""+sp.load(this, R.raw.attack14, 1));

}

public void playSound(int sound, int number) {
AudioManager am = (AudioManager) this
.getSystemService(this.AUDIO_SERVICE);
float maxv = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
// 获得stream 的最大音量 把系统音量传入 从而获得系统当前最大音量。
float currentv = am.getStreamVolume(AudioManager.STREAM_MUSIC);
// 获得当前音量
int temp = sp.play(spMap.get(sound), currentv, currentv, 1, number, 1);
//play返回streamID;
Log.v("myTag", "==:" + temp);

// 将打开的流放入spMaping里面
spMaping.put(i, temp);
i++;

}

public void funStop() {
Iterator it= spMaping.keySet().iterator();
while (it.hasNext()) {
Integer temp = (Integer)it.next();
Log.v("myTag", ""+temp);
sp.pause(temp);
}
}
}


2011-10-12
poolo
  相关解决方案