使用VideoView開發視頻總結


一、VideoView及其相關組件總結

Android中,播放視頻有2種方式,第一種方式是使用MediaPlayer結合SurfaceView來播放,通過MediaPlayer來控制視頻的播放、暫停、進度等,而通過SurfaceView來顯示視頻內容;第二種方式是使用VideoView來播放,這個類其實也是繼承了SurfaceView類,並且實現了MediaController.MediaPlayerController這個用於控制媒體播放的接口,另外在VideoView上還有一個用於對媒體播放進行控制的面板,包括快進、快退、播放、暫停按鈕以及一個進度條。使用VideoView播放視頻的好處是簡單因為它已經幫我們實現了SurfaceView以及控制方法,開發過程中只需直接拿來使用就可以了,但它的缺點是不夠靈活。而是用MediaPlayer結合SurfaceView來播放視頻的話,好處是可以更靈活的對其進行自定義,缺點是難度較大。

1.1通過VideoView播放視頻步驟:

1、在界面布局文件中定義VideoView組件,或在程序中創建VideoView組件

2、在Activity中獲取布局文件中的組件並設置相應的監聽;

3、調用VideoView的如下兩個方法來加載指定的視頻:

   (1)setVideoPath(String path):加載path文件代表的視頻

   (2)setVideoURI(URI uri):加載uri所對應的視頻

在使用setVideoURI(URI uri)方法之前要設置網絡視頻路徑

4、調用VideoViewstart()pause()resume()stopPlayback()方法控制視頻的播放(開始、暫停、繼續、停止)VideoViewgetDuration()可以返回視頻的長度,可以結合VideoViewresume()方法進行記憶播放和緩存播放。

1.2 VideoView常用方法

Android VideoView類為我們提供了十分方便的視頻播放API,其主要方法有:

 

方法名稱

說明

void start()

開始播放

void stopPlayback()

停止播放

void pause()

暫停

void resume()

重新播放

void seekTo(int msec)

從第幾毫秒開始播放

int getCurrentPosition()

獲取當前播放位置

int getDuration()

獲取當前視頻總長度

boolean isPlaying()

當前VideoView是否在播放視頻

void setVideoPath(String path)

以文件路徑的方式設置VideoView播放的視頻源

void setVideoURI(URI uri)

Uri的方式設置視頻源,可以是網絡Uri或本地Uri

setMediaCotroller(MediaController controller)

設置MediaController控制器

 

setOnCompletionListener(MediaPlayer.onCompletionListener l)

監聽播放完成的事件

setOnErrorListener(MediaPlayer.OnErrorListener l)

監聽播放發生錯誤時候的事件

setOnPreparedListener(MediaPlayer.OnPreparedListener l)

監聽視頻裝載完成的事件

 

1.3 Media Controller

Media Controller類為我們提供了一個懸浮的操作欄,包含了播放,暫停,快進,快退,上一個,下一個等功能鍵。還有拖動進度條至某一處也可以實現。在使用前VideoViewMeidaController需要相互指定控件。

 

Mdedia Controller類包含的內置方法有:

 

 

方法名稱

說明

boolean isShowing()

當前懸浮控制欄是否顯示。

void setMediaPlayer(MediaController.MediaPlayerControl player)

設置控制的組件

void hide()

隱藏MeidaController

void show()

顯示MeidaController

void show(int timeout)

設置MidiaController顯示的時間,以毫秒計算。如果設置為0則一直到調用hide()方法隱藏

void setPrevNextListeners(View.OnClickListener next,View.OnClickListener prev)

設置上一個視頻下一個視頻的切換事件

 

默認情況下,Media Controller懸浮顯示3s后隱藏,觸摸響應的VideoView呼出。默認上一個,下一個按鈕隱藏。

1.4 視頻格式

1.4.1 Android支持的視頻編碼格式

1.4.2 VideoView支持的影片格式

 

在實際測試中過程中,發現了一些由VideoView發出的Toast警告,內容寫着不支持影片格式,以致無法播放。VideoView僅能播放progressive streamable(漸進式流)的影片,一般的mp43gp若不采用progressive streamable模式轉文件的影片,是無法被VideoView通過網絡播放的,但假如存放在local端(如儲存卡)則不在此限。

 

1.5 VideoView的監聽處理

開發過程中使用的VideoView監聽一共有3個:setOnCompletionListener(MediaPlayer.onCompletionListener l)setOnErrorListener(MediaPlayer.OnErrorListener l)setOnPreparedListener(MediaPlayer.OnPreparedListener l)

1.5.1 setOnCompletionListener(MediaPlayer.onCompletionListener l)

setOnCompletionListener(MediaPlayer.onCompletionListener l)用於監聽視頻播放完成后的事件

1.5.2 setOnErrorListener(MediaPlayer.OnErrorListener l)

 setOnErrorListener(MediaPlayer.OnErrorListener l)用於監聽VideoView在使用過程中出現的各種錯誤。

錯誤常數:

  • MEDIA_ERROR_IO 
  • 文件不存在或錯誤,或網絡不可訪問錯誤 
  • : -1004 (0xfffffc14) 
  • MEDIA_ERROR_MALFORMED 
  • 流不符合有關標准或文件的編碼規范 
  • : -1007 (0xfffffc11) 
  • MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK 
  • 視頻流及其容器不適用於連續播放視頻的指標(例如:MOOV原子)不在文件的開始
  • : 200 (0x000000c8) 
  • MEDIA_ERROR_SERVER_DIED 
  • 媒體服務器掛掉了。此時,程序必須釋放MediaPlayer 對象,並重新new 一個新的。 
  • : 100 (0x00000064) 
  • MEDIA_ERROR_TIMED_OUT 
  • 一些操作使用了過長的時間,也就是超時了,通常是超過了3-5 
  • : -110 (0xffffff92) 
  • MEDIA_ERROR_UNKNOWN 
  • 未知錯誤 
  • : 1 (0x00000001) 
  • MEDIA_ERROR_UNSUPPORTED 
  • 比特流符合相關編碼標准或文件的規格,但媒體框架不支持此功能 
  • : -1010 (0xfffffc0e) 
  • what int: 標記的錯誤類型
  • MEDIA_ERROR_UNKNOWN 
  • MEDIA_ERROR_SERVER_DIED 
  • extra int: 標記的錯誤類型
  • MEDIA_ERROR_IO 
  • MEDIA_ERROR_MALFORMED 
  • MEDIA_ERROR_UNSUPPORTED 
  • MEDIA_ERROR_TIMED_OUT 
  • MEDIA_ERROR_SYSTEM (-2147483648) - low-level system error.

1.5.3 setOnPreparedListener(MediaPlayer.OnPreparedListener l)

setOnPreparedListener(MediaPlayer.OnPreparedListener l)用於監聽視頻裝在完成后的事件

二、視頻旋轉

在網上查詢了眾多的關於屏幕旋轉的方法。總結起來可以分為4種。在介紹之前要先了解默認情況下Android屏幕旋轉機制(當然是在手機本身屏幕旋轉功能開啟的時候才能實現,自己在開發過程中一直發現開發視頻不能隨着手機一起旋轉,弄了幾個小時才發現是自己Android本身自帶的旋轉按鈕沒有開啟):

默認情況下,當用戶的重力感應器打開后,屏幕旋轉方向會導致當前activity發生onDestory->onCreate,這樣會重新構造當前activity和界面布局,如果是在Camera界面,則表現為卡頓或者黑屏一段時間。如果是在橫豎屏UI設計方面,那么想很好的支持屏幕旋轉,則建議在res中建立layout-landlayport兩個文件夾,把橫屏和豎屏的文件分別放入對應的layout文件夾中。

2.1 AndroidMainfest.xml設置

如果單單想設置橫屏或者豎屏,那么只需添加橫豎屏代碼:

優點:即使屏幕旋轉,Actiity也不會重新onCreate

缺點:屏幕只有一個方向

2.2 代碼動態設置

如果需要動態改變橫豎屏設置,只要在代碼中調用setRequestedOrientation()函數:

優點:可以隨意動態設置,滿足人們為改變橫豎屏的要求,同時滿足橫豎屏UI不同的設計需求

缺點:如果改變設置,那么Activity會被銷毀,重新構建,即重新onCreate;

2.3 重寫onCongigurationChanged

使用此方法可以避免旋轉屏幕時Activity被不斷的onCreate情況(這種情況下往往造成屏幕切換時的卡頓)。

首先,在AndroidMainfest.xml中添加configChanges

注意:keyboardHidden表示鍵盤輔助功能隱藏,如果你的開發API等級等於或高於13,還需要設置screenSize,因為screenSize會在屏幕旋轉時改變

然后,在Activity中重寫onConfigurationChanged方法,這個方法將會在屏幕旋轉變化時,進行監聽處理:

優點:可以隨時監聽屏幕旋轉變化,並對應做出相應操作

缺點:它只能一次旋轉90°,如果一下子旋轉180°,onConfigurationChanged函數不會被調用。

2.4 結合OrientationEventListener,自定義旋轉監聽設置

這種方法由於自定義回掉接口暫時不明白,在這里暫不總結。

可以參考網站:http://www.jb51.net/article/64735.htm

三、誤按返回操作

為了防止用戶誤按返回鍵而退出播放,可以在程序中重寫onKeyDown方法。在這個方法中來處理用戶點擊返回鍵的動作:例如只有用戶在短時間內點擊兩次返回鍵才真正退出播放。

四、設置手機全屏

4.1 最常用的設置全屏方法

 

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 設置無標題
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        // 設置全屏
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main);
}

 

使用上述方法注意:requestWindowFeature()方法一定要在setContentView()前面,否則會報錯;

4.2 AndroidManifest中配置

 

利用Android提供的內置的Theme就可以了。

五、設置屏幕顯示方向

 

當不定義橫豎屏的情況下,這個app會隨着手機的轉向設置變化而變化,而我們對於橫豎屏切換肯定要做相應的事情,可以如下方法去做:

 

if (getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
            // 處理橫屏下要做的事
        
        } else {
            // 處理豎屏下要做的事情
            
        }

 

在這個視頻軟件中我要做到一個點擊按鈕讓手機旋轉的功能,就是用到了上面的代碼:

 

六、取消全屏的方法

getWindow().clearFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN);

 

七、Android系統自帶樣式

android:theme="@android:style/Theme.Dialog" 將一個Activity顯示為能話框模式 
android:theme="@android:style/Theme.NoTitleBar" 不顯示應用程序標題欄 
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 不顯示應用程序標題欄,並全屏 
android:theme="Theme.Light" 背景為白色 
android:theme="Theme.Light.NoTitleBar" 白色背景並無標題欄 
android:theme="Theme.Light.NoTitleBar.Fullscreen" 白色背景,無標題欄,全屏 
android:theme="Theme.Black" 背景黑色 
android:theme="Theme.Black.NoTitleBar" 黑色背景並無標題欄 
android:theme="Theme.Black.NoTitleBar.Fullscreen" 黑色背景,無標題欄,全屏 
android:theme="Theme.Wallpaper" 用系統桌面為應用程序背景 
android:theme="Theme.Wallpaper.NoTitleBar" 用系統桌面為應用程序背景,且無標題欄 
android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen" 用系統桌面為應用程序背景,無標題欄,全屏 
android:theme="Translucent"  透明背景
android:theme="Theme.Translucent.NoTitleBar"  透明背景並無標題
android:theme="Theme.Translucent.NoTitleBar.Fullscreen"  透明背景並無標題,全屏
android:theme="Theme.Panel"   面板風格顯示
android:theme="Theme.Light.Panel" 平板風格顯示

八、小結:

由於太久的時間沒有接觸Android開發,很多Android開發的東西都忘記了,代碼中具體的方法在這里不做一一總結,而在另外一篇文檔中總結說明。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM