android 視訊播放(一)利用android原生的videoview
阿新 • • 發佈:2019-01-31
轉載請註明地址 http://blog.csdn.net/shenxiaolei507
android的原生的視訊播放方式有三種,分別為:
佈局檔案很簡單,在一個相對佈局裡面包括了一個VideoView元件和ProgressBar元件,ProgressBar主要是用來在視訊載入過程中顯示。 VideoView設定程式碼
VideoView的前置播放工作就如前面的程式碼寫的,註釋已經很比較清楚,我在這裡再特別說明要注意說明幾點: (2)關於VideoView的錯誤監聽,如果進行處理或者在處理的時候返回的引數為假(false,表示錯誤沒被處理),錯誤會向用戶提示,不利於使用者體驗,關於具體資訊和錯誤的型別見以下程式碼
3、視訊的暫停 播放視訊時有可能有需要暫時離開這個介面的情況發生,比如來電話,所以我們應該在當前頁面Activity暫停時,保留當前播放的位置,當頁面再度重啟時跳轉到儲存的位置進行播放,具體實現程式碼如下
利用Android原生VideoView播放視訊暫時就介紹到這,關於其它的監聽介面實現,比如播放完成onCompletion,螢幕觸控OnTouch等,可以根據實際需求來進行實現,這裡就不再多講,如果有任何問題歡迎批評指正! 參考資料:
(一) 利用Intent呼叫系統自帶的播放器或者安裝的第三方播放器(二) 利用VideoView來播放視訊。 (三) 利用MediaPlayer類和SufferView來播放視訊 一、利用Intent呼叫系統自帶的播放器或者安裝的第三方播放器,非常簡單這裡就不在做過多的解釋,直接上程式碼
這種方式很簡單隻要設定好視訊路徑(可以是本地路徑和網路路徑),系統就會自動檢索手機上已安裝的視訊播放器來播放。 二、 利用VideoView來播放視訊 播放視訊可以說是手機已經必帶的一種功能,作為使用量最大的智慧手機作業系統的android怎麼可能不提供播放視訊的封裝呢,以利於我們這些偉大的程式設計師屌絲來快速開發。VideoVIew是android提供視訊播放封裝的一種元件,使用非常方便。好了,廢話不多說,進入正題。 1、VideoView的播放前準備 佈局檔案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);
<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等,可以根據實際需求來進行實現,這裡就不再多講,如果有任何問題歡迎批評指正! 參考資料: