public void play(){
MediaPlayer player = new MediaPlayer();
player.reset();//必须重置
player.setDataSource("xxxx.mp3");//设置路径本地文件
//设置远程路径
player.setDataSource("http://www.baidu.com/xxx.mp3");
player.prepare();//加载硬件文件等资源
player.prepareAsync();//异步加载网络路径文件
player.start();//重置再start就会重新播放
//远程文件异步异步加载完成事件
player.setOnPreparedListener(new OnPreparedListener(){
public void onPrepared(MediaPlayer mp){
mp.start();
}
});
//继续播放
player.start();
//暂停
player.puase();
}
// 音乐服务的停止方法一定要复写释放资源
public void onDestroy(){
super.onDestroy();
player.stop();//停止播放
player.release();//此时player所加载的资源全部释放了
}
- SeekBar设置进度,还能拉动设置进度
- setMax和setProcess设置最大值和进度条当前进度
Timer timer = new Timer();//定时器消息
timer.schedule(new TimerTask(){
public void run(){
int duration = player.getDuration();//获取总时长
player.getCurrentPostion();//获取当前进度
Message msg = MainActivity.handler.obtainMessage();
Bundle bundlle = new Bundle();
bundle.putInt("duration", duration);
bundle.putInt();
//handler 是建议写成static的形式
MainActivity.handler.sendMessage(msg);
}
}, 5,500);//开始计时任务的5ms后第一次执行run方法,后面每500ms执行一次
//启动了要注意取消定时器
timer.cancel();
//sb是SeekBar的实例,拉动进度
sb.setOnSeekBarChangeListener(new OnSeekBarChangeListner(){
player.seekTo(ms);//传入毫秒
});
###视频播放器
- 用SurfaceView做界面,游戏也用Surface
- SurfaceView有双缓存技术,内存里面有两帧,分别按序显示到屏幕上,也就是两个界面轮流刷到屏幕上,避免出现闪屏(闪屏实际上是因为单屏幕场景下要先清除到上一帧然后再绘制下一帧,就会在第一帧清除完毕会出现一个瞬时白屏)
- SurfaceView不可见就不会创建,因为它是重量级组件耗费资源
- SurfaceView可见就会创建,不可见就会销毁(即使对应的Activity没有被销毁)
<surfaceView
android:width="match_parent"
android:heigth="match_parent"
/>
public void onCreate(){
}
- MediaPlayer支持格式太弱了,可以用Vitamio第三方库,其封装了FFMPEG
- 也可以用百度媒体云