1. 程式人生 > >android 視訊播放(一)利用android原生的videoview

android 視訊播放(一)利用android原生的videoview

轉載請註明地址 http://blog.csdn.net/shenxiaolei507      android的原生的視訊播放方式有三種,分別為:
(一) 利用Intent呼叫系統自帶的播放器或者安裝的第三方播放器
         (二) 利用VideoView來播放視訊。          (三) 利用MediaPlayer類和SufferView來播放視訊 一、利用Intent呼叫系統自帶的播放器或者安裝的第三方播放器,非常簡單這裡就不在做過多的解釋,直接上程式碼
  Uri uri=Uri.parse("http://123.150.52.227/0725695b00000000-1415769042-1960016430/data5/vkplx.video.qq.com/flv/74/164/a0015193bxf.p203.1.mp4");
  Intent intent=new Intent(Intent.ACTION_VIEW);
  intent.setDataAndType(uri,"video/*");
  startActivity(intent);
這種方式很簡單隻要設定好視訊路徑(可以是本地路徑和網路路徑),系統就會自動檢索手機上已安裝的視訊播放器來播放。 二、 利用VideoView來播放視訊          播放視訊可以說是手機已經必帶的一種功能,作為使用量最大的智慧手機作業系統的android怎麼可能不提供播放視訊的封裝呢,以利於我們這些偉大的程式設計師屌絲來快速開發。VideoVIew是android提供視訊播放封裝的一種元件,使用非常方便。好了,廢話不多說,進入正題。 1、VideoView的播放前準備  佈局檔案
<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"
    tools:context=".MainActivity">

    <VideoView
        android:id="@+id/videoView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />
</RelativeLayout>

佈局檔案很簡單,在一個相對佈局裡面包括了一個VideoView元件和ProgressBar元件,ProgressBar主要是用來在視訊載入過程中顯示。 VideoView設定程式碼
/**
     *初始化videoview播放
     */
    public void initVideoView(){
        //初始化進度條
        progressBar= (ProgressBar) findViewById(R.id.progressBar);
        //初始化VideoView
        videoView= (VideoView) findViewById(R.id.videoView);
        //初始化videoview控制條
        mediaController=new MediaController(this);
        //設定videoview的控制條
        videoView.setMediaController(mediaController);
        //設定顯示控制條
        mediaController.show(0);
        //設定播放完成以後監聽
        videoView.setOnCompletionListener(this);
        //設定發生錯誤監聽,如果不設定videoview會向用戶提示發生錯誤
        videoView.setOnErrorListener(this);
        //設定在視訊檔案在載入完畢以後的回撥函式
        videoView.setOnPreparedListener(this);
        //設定videoView的點選監聽
        videoView.setOnTouchListener(this);
        //設定網路視訊路徑
        Uri uri=Uri.parse("http://123.150.52.227/0725695b00000000-1415769042-1960016430/data5/vkplx.video.qq.com/flv/74/164/a0015193bxf.p203.1.mp4");
        videoView.setVideoURI(uri);
        //設定為全屏模式播放
        setVideoViewLayoutParams(1);
    }

VideoView的前置播放工作就如前面的程式碼寫的,註釋已經很比較清楚,我在這裡再特別說明要注意說明幾點: (2)關於VideoView的錯誤監聽,如果進行處理或者在處理的時候返回的引數為假(false,表示錯誤沒被處理),錯誤會向用戶提示,不利於使用者體驗,關於具體資訊和錯誤的型別見以下程式碼
    /**
     * 視訊播放發生錯誤時呼叫的回撥函式
     */
    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
        switch (what){
            case MediaPlayer.MEDIA_ERROR_UNKNOWN:
                Log.e("text","發生未知錯誤");

                break;
            case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
                Log.e("text","媒體伺服器宕機");
                break;
            default:
                Log.e("text","onError+"+what);
                break;
        }
        switch (extra){
            case MediaPlayer.MEDIA_ERROR_IO:
                //io讀寫錯誤
                Log.e("text","檔案或網路相關的IO操作錯誤");
                break;
            case MediaPlayer.MEDIA_ERROR_MALFORMED:
                //檔案格式不支援
                Log.e("text","位元流編碼標準或檔案不符合相關規範");
                break;
            case MediaPlayer.MEDIA_ERROR_TIMED_OUT:
                //一些操作需要太長時間來完成,通常超過3 - 5秒。
                Log.e("text","操作超時");
                break;
            case MediaPlayer.MEDIA_ERROR_UNSUPPORTED:
                //位元流編碼標準或檔案符合相關規範,但媒體框架不支援該功能
                Log.e("text","位元流編碼標準或檔案符合相關規範,但媒體框架不支援該功能");
                break;
            default:
                Log.e("text","onError+"+extra);
                break;
        }
        <span style="color:#ff0000;">//如果未指定回撥函式, 或回撥函式返回假,VideoView 會通知使用者發生了錯誤。這點需要特別注意</span>
        return false;
    }
 (3)關於設定全屏、視窗播放、適應大小播放,VideoView需要進行特別的設定。現在這樣的需求很多,網上也有很多例子。我在對很多例子進行對比分析得出,對VideoView單獨設定的方法相對比較靈活,而設定的前提是為VideoView設定父佈局,具體用法見程式碼
    /**
     * 設定videiview的全屏和視窗模式
     * @param paramsType 標識 1為全屏模式 2為視窗模式
     */
    public void setVideoViewLayoutParams(int paramsType){
		//全屏模式
        if(1==paramsType) {
			//設定充滿整個父佈局
            RelativeLayout.LayoutParams LayoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
			//設定相對於父佈局四邊對齊
            LayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
            LayoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
            LayoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
            LayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
			//為VideoView新增屬性
            videoView.setLayoutParams(LayoutParams);
        }else{
			//視窗模式
            //獲取整個螢幕的寬高
            DisplayMetrics DisplayMetrics=new DisplayMetrics();
            this.getWindowManager().getDefaultDisplay().getMetrics(DisplayMetrics);
			//設定視窗模式距離邊框50
            int videoHeight=DisplayMetrics.heightPixels-50;
            int videoWidth=DisplayMetrics.widthPixels-50;
            RelativeLayout.LayoutParams LayoutParams = new RelativeLayout.LayoutParams(videoWidth,videoHeight);
			//設定居中
            LayoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
			//為VideoView新增屬性
            videoView.setLayoutParams(LayoutParams);
        }
    }
2、播放視訊       播放視訊的做法比較好的是與Activity的生命週期相結合,但也不是必須,視訊播放也是呼叫start()的方法具體程式碼如下
    @Override
    protected void onStart() {
        super.onStart();
        //啟動視訊播放
        videoView.start();
        //設定獲取焦點
        videoView.setFocusable(true);

    }

3、視訊的暫停       播放視訊時有可能有需要暫時離開這個介面的情況發生,比如來電話,所以我們應該在當前頁面Activity暫停時,保留當前播放的位置,當頁面再度重啟時跳轉到儲存的位置進行播放,具體實現程式碼如下
/**
     * 頁面暫停效果處理
     */
    @Override
    protected  void onPause() {
        super.onPause();
        //如果當前頁面暫停則儲存當前播放位置,全域性變數儲存
        intPositionWhenPause=videoView.getCurrentPosition();
        //停止回放視訊檔案
        videoView.stopPlayback();
    }

    /**
     * 頁面從暫停中恢復
     */
    @Override
    protected void onResume() {
        super.onResume();
       //跳轉到暫停時儲存的位置
        if(intPositionWhenPause>=0){
            videoView.seekTo(intPositionWhenPause);
            //初始播放位置
            intPositionWhenPause=-1;
        }
    }
4、視訊的載入       播放視訊不論網路視訊檔案還是本地視訊檔案,都需要載入的過程,這個過程我們要進行處理,利於使用者體驗。在第一步VideoView配置的時候,已經設定了載入監聽setOnPreparedListener(this),具體實現方法見如下程式碼
    /**
     * 視訊檔案載入文成後呼叫的回撥函式
     * @param mp
     */
    @Override
    public void onPrepared(MediaPlayer mp) {
     //如果檔案載入成功,隱藏載入進度條
        progressBar.setVisibility(View.GONE);

    }

利用Android原生VideoView播放視訊暫時就介紹到這,關於其它的監聽介面實現,比如播放完成onCompletion,螢幕觸控OnTouch等,可以根據實際需求來進行實現,這裡就不再多講,如果有任何問題歡迎批評指正! 參考資料: