Android中的音频播放使用的是MediaPlayer类,但是这个类没有提供视频画面的播放位置,所以这里视频的播放显得略有不同,大致分为两种播放方式:直接调用系统的VideoView播放视频或者利用Mediaplayer与SurfaceView的结合使用达到视频播放。    

  一:直接利用系统的VideoView实现的视频播放

  (1)在主界面上拖拽一个VideoView控件

  (2)在主Activity中完成以下操作:

  ◆声明VideoView控件及查找到ID

1
vv = (VideoView) findViewById(R.id.videoView1);

   ◆设置资源的路径,这里我们把视频放到了sdCard上,注意获得几乎所有手机sdCard路径的方式

1
2
//设置视频的路径
vv.setVideoURI(Uri.fromFile( new File(Environment.getExternalStorageDirectory().getAbsoluteFile()+ "/视频的播放路径及文件名" )));

   ◆添加系统的控制器

1
2
//添加系统的控制器,能出现快进快退等控制条
vv.setMediaController( new MediaController( this ));

   ◆调用start方法开始视频的播放

1
2
//开始播放视频
vv.start();

  (3)结果:调用系统的VideoView完成视频的播放

  二:将MediaPlayer与SurfaceView结合实现视频播放

   1:SurfaceView

  一般情况下,我们会把绘制图形等操作放在主UI中操作,这样主UI不仅要处理绘制操作,还要处理用户的其他单击操作等,这样未免显得过于臃肿。因此,对于SurfaceView的提出,就是把这样的一些耗时操作放到另外一个单独的线程中去完成的过程。

  他提供了一个Surface,并可以通过控制器SurfaceHolder去控制Surface的操作。通过getHolder方法可以获得控制器对象。需要重写的几个方法如下

  (1)surfaceCreated方法:当Surfaceview第一次创建的时候出发的方法,主要完成初始化的工作,一般不要在这里完成绘制操作。

  (2)surfaceChanged方法:当Surface的状态发生变化时,触发的方法

  (3)surfaceDestroyed方法:当Surface销毁前触发的状态,用于清理资源

  2:视频的播放

  (1)在主界面上拖拽一个surfaceview,下面摆放四个按钮,用来自己定义控制视频的播放

  (2)获得控制器对象,设置相应的属性

1
2
//SurfaceView自己不管理缓冲区,让频幕渲染器引擎自动管理视频到用户面前
sv.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

  (3)实例化MediaPlayer对象

1
mediaPlayer = new MediaPlayer();

  (4)start操作的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void start() {
//重置
mediaPlayer.reset();
try {
// 设置视频资源
mediaPlayer.setDataSource( this , Uri.fromFile( new File(Environment
.getExternalStorageDirectory().getAbsoluteFile()
+ "/视频路径及文件名后缀" )));
// 设置视频显示的位置,这里是在surfaceView上
mediaPlayer.setDisplay(sv.getHolder());
// 准备资源
mediaPlayer.prepare();
// 启动视频
mediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
}

  (5)stop操作的实现

1
mediaPlayer.stop(); //停止视频

  (6)pause操作的实现

1
2
3
4
5
6
// 视频是否在播放
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause(); // 是就停止
} else {
mediaPlayer.start(); // 不是就开始
}

  (7)setPosition操作的实现

1
mediaPlayer.seekTo( 5000 ); // 跳到5000毫秒的位置,不论你现在在哪个位置上

  (8)结果:实现了视频的播放


  SurfaceView的用处远不在于此,还可以用于图形图像处理当中,我们明日再续。。不见不散j_0045.gif