標籤:風飛雪未揚 從零開始學android 安卓mediaplayer播放視頻
MediaPlayer除了可以對音頻播放之外,也可以對視頻進行播放,但是如果要播放視頻只依靠MediaPlayer還是不夠的,還需要編寫一個可以用於視頻顯示的空間,而這塊顯示空間要求可以快速的進行GUI的更新,而且可以在渲染代碼時進行無阻塞的的對GUI進行渲染,而如果要完成此種功能,則必須依靠android.view.SurfaceView組件完成,SurfaceView組件封裝了一個Surface對象,而不是一個Canvas對象,使用Surface可以完成對後台線程的控制,對於像視頻、3D圖形等需要快速更新或者高幀率的地方上有很大的用處。
SurfaceHolder顯示一個surface的抽象介面,使你可以控制surface的大小和格式, 以及在surface上編輯像素,和監視surace的改變。這個介面通常通過SurfaceView類實現。
下面就結合前一節寫過的例子來實現mediaplayer對視頻的播放。
首先在xml配置surfaceview對象。
<span style="font-size:18px;"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <ImageButton android:id="@+id/imageButton1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:src="@drawable/play" /><SurfaceView android:id="@+id/surfaceview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_below="@+id/imageButton1" /><ImageButton android:id="@+id/imageButton2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/surfaceview" android:layout_alignRight="@+id/surfaceview" android:src="@drawable/stop" /><ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/surfaceview" android:layout_centerHorizontal="true" android:layout_marginBottom="162dp" /></RelativeLayout></span>
Java檔案
<span style="font-size:18px;">package com.example.mediaplayer2;import java.io.File;import android.app.Activity;import android.media.AudioManager;import android.media.MediaPlayer;import android.os.Bundle;import android.os.Environment;import android.view.MotionEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnHoverListener;import android.widget.ImageButton;import android.widget.ImageView;public class MainActivity extends Activity {private ImageButton play = null;// 播放private ImageButton stop = null;// 停止播放private MediaPlayer media = null;private ImageView image=null ;private SurfaceView surfaceView = null;private SurfaceHolder surfaceHolder = null;private Boolean pauseFlag=false;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(R.layout.activity_main);this.play = (ImageButton) super.findViewById(R.id.imageButton1);this.stop = (ImageButton) super.findViewById(R.id.imageButton2);this.surfaceView = (SurfaceView) super.findViewById(R.id.surfaceview);// 執行個體化SurfaceViewthis.surfaceHolder = this.surfaceView.getHolder();// 執行個體化SurfaceHolderthis.surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);// 設定格式this.image=(ImageView)this.findViewById(R.id.imageView1);this.media = new MediaPlayer();// 執行個體化MeidaPlayer組件try {// 取得SD卡上的視頻檔案String path = Environment.getExternalStorageDirectory()+ File.separator + "Movies" + File.separator + "abc.mp4";// 設定資源this.media.setDataSource(path); // 少了一些判斷} catch (Exception e) {e.printStackTrace();}// 分別對開始播放盒停止播放進行監聽this.play.setOnClickListener(new PlayOnClickListenerImpl());this.stop.setOnClickListener(new StopOnClickListenerImpl());this.surfaceView.setOnClickListener(new pauseOrstart() );this.surfaceView.setOnHoverListener(new OnHoverListener() {public boolean onHover(View v, MotionEvent event) {// TODO Auto-generated method stubif (MainActivity.this.media.isPlaying()) {MainActivity.this.image.setImageResource(R.drawable.stop);}else {MainActivity.this.image.setImageResource(R.drawable.play);}return true;}});}private class PlayOnClickListenerImpl implements OnClickListener {@Overridepublic void onClick(View v) {// 設定音頻格式啊MainActivity.this.media.setAudioStreamType(AudioManager.STREAM_MUSIC);// 設定播放的範圍MainActivity.this.media.setDisplay(MainActivity.this.surfaceHolder);try {// 準備播放MainActivity.this.media.prepare();} catch (Exception e) {}// 開始播放MainActivity.this.media.start();}}private class StopOnClickListenerImpl implements OnClickListener {@Overridepublic void onClick(View v) {// 停止播放if (MainActivity.this.media!=null) {MainActivity.this.media.stop();}}}private class pauseOrstart implements OnClickListener{@Overridepublic void onClick(View v) {// TODO Auto-generated method stubif (MainActivity.this.media!=null) {if (MainActivity.this.pauseFlag) {MainActivity.this.media.start();MainActivity.this.pauseFlag=false;}else {MainActivity.this.media.pause();MainActivity.this.pauseFlag=true;}}}}}</span>
這樣就實現了簡單的視頻播放功能,但是由於解碼器的緣故現在僅支援3gp和部分MP4視頻的播放,想要播放更多的視頻格式需要另外寫演算法或下載解碼器實現
下節預報:AudioManagerandroid聲音編輯器
從零開始學android<mediaplayer內建播放器(視頻播放).四十九.>