最近项目中有用到音频播放,故将音频播放相关做一个汇总。
准备
在汇总之前,先做一个了解。音频播放的方式有哪几种?
1. MediaPlayer类
2. SoundPool类
两种方式的应用场景?
1. MediaPlayer类
适用于播放较长的音频文件,只能播放单一的文件,不支持多个文件同时播放。由于文件较大,所以资源占用率较高,延迟时间较长。
2. SoundPool类
适用于播放较短的音频文件,并且文件的大小限制在1M左右,可支持多个文件同时播放。SoundPool提供了pause和stop方法,但这些方法建议最好不要轻易使用,因为有些时候它们可能会使你的程序莫名其妙的终止。调用pause并不会立即停止,而是把缓冲区里的数据播放完才会停下来,也许会多播放一秒钟。 所以该APi比较适用于比较多尔密集的音效,比如游戏等,或者很短的音频。
开始
MediaPlayer
使用如下
public class MediaActivity extends Activity implements View.OnClickListener {
private MediaPlayer player;
private SoundPool soundPool;
private Timer mTimer = new Timer(true);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//目前是加载本地的mp3文件,支持网络地址
player = MediaPlayer.create(getApplicationContext(), R.raw.a);
// 存储在SD卡或其他文件路径下的媒体文件
// mp.setDataSource("/sdcard/test.mp3");
// 网络上的媒体文件
// 例如:mp.setDataSource("http://www.citynorth.cn/music/confucius.mp3");
}
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
Log.i("MediaActivity","当前播放进度"+player.getCurrentPosition());
Log.i("MediaActivity","总体播放进度"+player.getDuration());
Log.i("MediaActivity","播放进度"+(int)((player.getCurrentPosition()*1.0f)/(player.getDuration()*1.0f)*100));
}
};
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_start://播放
player.start();
mTimer.schedule(timerTask, 0, 10);
break;
case R.id.btn_finsh://暂停
player.pause();
mTimer.cancel();
break;
case R.id.btn_drag://拖动到一半
if(null!=player){
player.seekTo(player.getDuration()/2);
}
break;
case R.id.btn_reset://重复
if(null!=player){
player.seekTo(0);
}
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (null != player) {
mTimer.cancel();
player.release();//释放资源
}
}
}
SoundPool
使用如下
public class MainActivity extends Activity implements View.OnClickListener {
private SoundPool soundPool;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
soundPool = new SoundPool(12, 0,5);
AudioManager mgr = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_start:
soundPool.play(soundPool.load(this, R.raw.a, 1), 1,1, 0, 0, 1);
//参数:1、播放来源 2、当前音量 3、最大音量 4、优先级 5、重播次数 6、播放速度
break;
}
}
}
总结
以上就是Android音频播放的两种方式,可根据总结项目的要求进行挑选。