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方法開始視頻的播放
(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 |
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()
+ "/視頻路徑及文件名後綴" )));
mediaPlayer.setDisplay(sv.getHolder());
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
}
|
|
(5)stop操作的實現
(6)pause操作的實現
1 2 3 4 5 6 |
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
} else {
mediaPlayer.start();
}
|
|
(7)setPosition操作的實現
1 | mediaPlayer.seekTo( 5000 );
|
|
(8)結果:實現了視頻的播放
SurfaceView的用處遠不在於此,還可以用於圖形圖像處理當中,我們明日再續。。不見不散