MediaPlayer结合SurfaceView播放视频
和播放音频大致相同
因为视频加载相对较慢 所以 需要异步加载
mediaplayer.prepareAsync();
//准备完成的监听
mediaplayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaplayer.start();
}
});
结合SurfaceView(双缓冲技术) 显示视频
布局:
<SurfaceView
android:id="@+id/sv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
代码:
surfaceView = (SurfaceView) findViewById(R.id.sv);
holder = surfaceView.getHolder();//SurfaceView 的管理器
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
// play(); //surfaceview 创建完成后播放视频
mediaplayer = new MediaPlayer();
try {
mediaplayer.setDataSource("http://mp3hot.9ku.com/hot/2009/08-27/186947.mp3");
mediaplayer.prepareAsync();
mediaplayer.setDisplay(holder);//绑定surfaceview
//准备完成的监听
mediaplayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaplayer.start();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
});
进阶:实时显示播放进度 且可拖拽
在播放开始后 定义一个 Timer计时器 设置每隔1秒钟 获取一次当前播放进度 并设置到进度条上
并定义一个拖拽进度条监听 动态设置播放进度
<SeekBar
android:id="@+id/seekBar"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
/>
/**
* 进度条
*/
public void addTime() {
Timer timer = new Timer();
TimerTask timertask = new TimerTask() {
@Override
public void run() {
if (mediaplayer != null && mediaplayer.isPlaying()) {
int progress = mediaplayer.getCurrentPosition();
int total = mediaplayer.getDuration();
seekBar.setMax(total);
seekBar.setProgress(progress);//timer 可以直接操作ui线程
}
}
};
//运行开始后的50毫秒执行第一次 并且以后每隔500毫秒执行一次
timer.schedule(timertask, 50, 500);
}
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) { //拖拽监听 当拖拽完成后执行
if (mediaplayer != null && mediaplayer.isPlaying()) {
mediaplayer.seekTo(seekBar.getProgress());
}
}
});
Demo图:
链接:http://pan.baidu.com/s/1hs33PL6 密码:7n6t