如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:
2) 不支持多个音频同时播放。
Android中除了MediaPlayer播放音频之外还提供了SoundPool来播放音效,SoundPool使用音效池的概念来管理多个短促的音效,例如它可以开始就加载20个音效,以后在程序中按音效 的ID进行播放。
使用SoundPool播放音频的步骤如下:
1,创建SoundPool对象
SoundPool(int maxStreams,int streamType,int srcQuality)
//其中,maxStreams用来指定可以容纳多少个音频,streamType用来指定声音类型,可以通过AudioManager类提供的常量进行指定,通常使用STREAM_MUSIC; srcQuality参数用于指定音频的品质,0为默认
Public int load(Context context,int resid,int priority)
//用于通过指定的资源来加载音频,返回soundID,用于播放使用
Public int load(String path,int priority)
//用于通过音频文件的路径来加载音频,返回soundID,用于播放使用
Public int load(AssetFileDescriptor afd,int priority)
//用于从AssetFileDescriptor所对应的文件中加载音频,返回soundID,用于播放使用
Public int load(FileDescriptor fd,long offset,long length,int priority)
//用于加载FileDescriptor对象中,从offset开始,长度为length的音频,返回soundID,用于播放使用
3、播放音频
play (int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
//参数说明:
//参数 描述
//soundID 用于指定要播放的音频,该音频为通过load()方法返回的音频soundID
//leftVolume 用于指定左声道的音量,取值为0-1.0
//rightVolume 用于指定左声道的音量,取值为0-1.0
//priority 用于指定播放音频的优先级,数值越大,优先级越高
//loop 用于设置循环次数0为不循环-1为循环
//rate 用于指定速率,1为正常,最小值为0.5 最高值为2
作为测试的代码
package com.xykj.mediaplayerdemo;
import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import java.util.HashMap;
import java.util.Map;
public class SoundPoolActivity extends AppCompatActivity implements View.OnClickListener {
//存放声音资源的Map
private Map<Integer, Integer> soundMap;
private SoundPool mSoundPool;
//音频管理器
private AudioManager am;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sound_pool);
findViewById(R.id.btn1).setOnClickListener(this);
findViewById(R.id.btn2).setOnClickListener(this);
findViewById(R.id.btn3).setOnClickListener(this);
findViewById(R.id.btn4).setOnClickListener(this);
findViewById(R.id.btn5).setOnClickListener(this);
findViewById(R.id.btn6).setOnClickListener(this);
findViewById(R.id.btn7).setOnClickListener(this);
initSoundPool();
//加载系统音频管理器
am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
}
private void initSoundPool() {
//初始化SoundPool(声音数量,类型,质量)
mSoundPool = new SoundPool(7, AudioManager.STREAM_MUSIC, 100);
// 初始化资源
soundMap = new HashMap<>();
//load方法表示加载音频资源(Context对象,音频资源,优先级)
soundMap.put(1, mSoundPool.load(this, R.raw.c4, 1));
soundMap.put(2, mSoundPool.load(this, R.raw.d4, 1));
soundMap.put(3, mSoundPool.load(this, R.raw.e4, 1));
soundMap.put(4, mSoundPool.load(this, R.raw.f4, 1));
soundMap.put(5, mSoundPool.load(this, R.raw.g4, 1));
soundMap.put(6, mSoundPool.load(this, R.raw.a4, 1));
soundMap.put(7, mSoundPool.load(this, R.raw.b4, 1));
}
private void play(int index){
//获取当前音量
float currentVolumn = am.getStreamVolume(AudioManager.STREAM_MUSIC);
//最大音量
float maxVolumn = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC); // 100
float volumn = currentVolumn/maxVolumn;
/**
* 第一个参数表示音频的下标
* 第二个参数和第三个参数表示左右声道(0,1)
* 第四个参数表示优先级
* 第五个参数表示是否需要循环,-1表示循环,0表示不循环
* 第六个参数表示 rate:0.5-2.0 其中1表示正常
*/
mSoundPool.play(index,volumn,volumn,1,0,1.0f);
}
@Override
public void onClick(View v) {
String str = ((Button)v).getText().toString();
int index = Integer.parseInt(str);
play(index);
}
}
七个资源包是音频 do、re 、mi、fa、so、la、si
可以做一个钢琴的键设置监听来实现弹奏钢琴的demo