Android播放视频的三种方式示例
泡在网上的日子 发表于2012-12-12 20:32, 第 297 次阅读
摘要 在Android中,我们有三种方式来实现视频的播放: 1、使用其自带的播放器。指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型。 2、使用VideoView来播放。在布局文件中使用VideoView结合MediaController来实现对其控制。 3、使用MediaPlayer类和SurfaceVi
在Android中,我们有三种方式来实现视频的播放:
1、使用其自带的播放器。指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型。
2、使用VideoView来播放。在布局文件中使用VideoView结合MediaController来实现对其控制。
3、使用MediaPlayer类和SurfaceView来实现,这种方式很灵活。
1、调用其自带的播放器:
1
2
3
4
5
6
|
Uri
uri = Uri.parse(Environment.getExternalStorageDirectory().getPath()+ "/Test_Movie.m4v" );
//调用系统自带的播放器
Intent
intent = new
Intent(Intent.ACTION_VIEW); Log.v( "URI:::::::::" ,
uri.toString()); intent.setDataAndType(uri,
"video/mp4" );
startActivity(intent); |
2、使用VideoView来实现:
1
2
3
4
5
6
|
Uri
uri = Uri.parse(Environment.getExternalStorageDirectory().getPath()+ "/Test_Movie.m4v" );
VideoView
videoView = (VideoView) this .findViewById(R.id.video_view);
videoView.setMediaController( new
MediaController( this ));
videoView.setVideoURI(uri);
videoView.start();
videoView.requestFocus(); |
3、使用MediaPlayer:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
|
package
demo.camera; import
java.io.IOException; import
android.app.Activity; import
android.media.MediaPlayer; import
android.media.MediaPlayer.OnCompletionListener; import
android.media.MediaPlayer.OnErrorListener; import
android.media.MediaPlayer.OnInfoListener; import
android.media.MediaPlayer.OnPreparedListener; import
android.media.MediaPlayer.OnSeekCompleteListener; import
android.media.MediaPlayer.OnVideoSizeChangedListener; import
android.os.Bundle; import
android.os.Environment; import
android.util.Log; import
android.view.Display; import
android.view.SurfaceHolder; import
android.view.SurfaceView; import
android.widget.LinearLayout; /**
*
该实例中使用MediaPlayer完成播放,同时界面使用SurfaceView来实现 *
*
这里我们实现MediaPlayer中很多状态变化时的监听器 *
*
使用Mediaplayer时,也可以使用MediaController类,但是需要实现MediaController.mediaController接口
*
实现一些控制方法。 *
*
然后,设置controller.setMediaPlayer(),setAnchorView(),setEnabled(),show()就可以了,这里不再实现
*
@author Administrator *
*/ public
class VideoSurfaceDemo extends Activity implements OnCompletionListener,OnErrorListener,OnInfoListener,
OnPreparedListener,
OnSeekCompleteListener,OnVideoSizeChangedListener,SurfaceHolder.Callback{
private
Display currDisplay; private
SurfaceView surfaceView; private
SurfaceHolder holder; private
MediaPlayer player; private
int vWidth,vHeight; //private
boolean readyToPlay = false; public
void onCreate(Bundle savedInstanceState){ super .onCreate(savedInstanceState);
this .setContentView(R.layout.video_surface);
surfaceView
= (SurfaceView) this .findViewById(R.id.video_surface);
//给SurfaceView添加CallBack监听
holder
= surfaceView.getHolder(); holder.addCallback( this );
//为了可以播放视频或者使用Camera预览,我们需要指定其Buffer类型
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//下面开始实例化MediaPlayer对象
player
= new
MediaPlayer(); player.setOnCompletionListener( this );
player.setOnErrorListener( this );
player.setOnInfoListener( this );
player.setOnPreparedListener( this );
player.setOnSeekCompleteListener( this );
player.setOnVideoSizeChangedListener( this );
Log.v( "Begin:::" ,
"surfaceDestroyed
called" );
//然后指定需要播放文件的路径,初始化MediaPlayer
String
dataPath = Environment.getExternalStorageDirectory().getPath()+ "/Test_Movie.m4v" ;
try
{ player.setDataSource(dataPath);
Log.v( "Next:::" ,
"surfaceDestroyed
called" );
}
catch
(IllegalArgumentException e) { e.printStackTrace();
}
catch
(IllegalStateException e) { e.printStackTrace();
}
catch
(IOException e) { e.printStackTrace();
}
//然后,我们取得当前Display对象
currDisplay
= this .getWindowManager().getDefaultDisplay();
}
@Override
public
void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
//
当Surface尺寸等参数改变时触发 Log.v( "Surface
Change:::" ,
"surfaceChanged
called" );
}
@Override
public
void surfaceCreated(SurfaceHolder holder) { //
当SurfaceView中的Surface被创建的时候被调用 //在这里我们指定MediaPlayer在当前的Surface中进行播放
player.setDisplay(holder);
//在指定了MediaPlayer播放的容器后,我们就可以使用prepare或者prepareAsync来准备播放了
player.prepareAsync();
}
@Override
public
void surfaceDestroyed(SurfaceHolder holder) { Log.v( "Surface
Destory:::" ,
"surfaceDestroyed
called" );
}
@Override
public
void onVideoSizeChanged(MediaPlayer arg0, int arg1, int arg2) { //
当video大小改变时触发 //这个方法在设置player的source后至少触发一次
Log.v( "Video
Size Change" ,
"onVideoSizeChanged
called" );
}
@Override
public
void onSeekComplete(MediaPlayer arg0) { //
seek操作完成时触发 Log.v( "Seek
Completion" ,
"onSeekComplete
called" );
}
@Override
public
void onPrepared(MediaPlayer player) { //
当prepare完成后,该方法触发,在这里我们播放视频 //首先取得video的宽和高
vWidth
= player.getVideoWidth(); vHeight
= player.getVideoHeight(); if (vWidth
> currDisplay.getWidth() || vHeight > currDisplay.getHeight()){ //如果video的宽或者高超出了当前屏幕的大小,则要进行缩放
float
wRatio = (float)vWidth/(float)currDisplay.getWidth(); float
hRatio = (float)vHeight/(float)currDisplay.getHeight(); //选择大的一个进行缩放
float
ratio = Math.max(wRatio, hRatio); vWidth
= (int)Math.ceil((float)vWidth/ratio); vHeight
= (int)Math.ceil((float)vHeight/ratio); //设置surfaceView的布局参数
surfaceView.setLayoutParams( new
LinearLayout.LayoutParams(vWidth, vHeight)); //然后开始播放视频
player.start();
}
}
@Override
public
boolean onInfo(MediaPlayer player, int whatInfo, int extra) { //
当一些特定信息出现或者警告时触发 switch (whatInfo){
case
MediaPlayer.MEDIA_INFO_BAD_INTERLEAVING: break ;
case
MediaPlayer.MEDIA_INFO_METADATA_UPDATE: break ;
case
MediaPlayer.MEDIA_INFO_VIDEO_TRACK_LAGGING: break ;
case
MediaPlayer.MEDIA_INFO_NOT_SEEKABLE: break ;
}
return
false ;
}
@Override
public
boolean onError(MediaPlayer player, int whatError, int extra) { Log.v( "Play
Error:::" ,
"onError
called" );
switch
(whatError) { case
MediaPlayer.MEDIA_ERROR_SERVER_DIED: Log.v( "Play
Error:::" ,
"MEDIA_ERROR_SERVER_DIED" );
break ;
case
MediaPlayer.MEDIA_ERROR_UNKNOWN: Log.v( "Play
Error:::" ,
"MEDIA_ERROR_UNKNOWN" );
break ;
default :
break ;
}
return
false ;
}
@Override
public
void onCompletion(MediaPlayer player) { //
当MediaPlayer播放完成后触发 Log.v( "Play
Over:::" ,
"onComletion
called" );
this .finish();
}
} |