android 多媒体编程(二) MediaPlayer 播放视频

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值