Android 視頻播放器 (一):使用VideoView播放視頻

1、簡介

做爲Android開發,咱們不可避免的會接觸到視頻播放,VideoView作爲最簡單的播放器,咱們是不該該不會的。android

下面簡單介紹一下VideoView:網絡

  • VideoView是使用MediaPlayer來對視頻文件進行控制的。
  • VideoView只支持mp四、avi、3gp格式的視頻,支持格式相對單一,VideoView支持的格式能夠參考MediaPlayer。
  • VideoView能夠播放網絡視頻,支持的網絡視頻的協議爲:Http協議和RTSP協議兩種。

2、VideoView經常使用方法

Android VideoView類爲咱們提供了十分方便的視頻播放API,其主要方法以下:ide

  • setVideoPath:設置要播放的視頻文件的位置
  • start:開始或繼續播放視頻
  • pause:暫停播放視頻
  • resume:將視頻從頭開始播放
  • seekTo:從指定的位置開始播放視頻
  • isPlaying:判斷當前是否正在播放視頻
  • getCurrentPosition:獲取當前播放的位置
  • getDuration:獲取載入的視頻文件的時長
  • setVideoPath(String path):以文件路徑的方式設置VideoView播放的視頻源
  • setVideoURI(Uri uri):以Uri的方式設置視頻源,能夠是網絡Uri或本地Uri
  • setMediaController(MediaController controller):設置MediaController控制器
  • setOnCompletionListener(MediaPlayer.onCompletionListener l):監聽播放完成的事件
  • setOnErrorListener(MediaPlayer.OnErrorListener l):監聽播放發生錯誤時候的事件
  • setOnPreparedListener(MediaPlayer.OnPreparedListener l):監聽視頻裝載完成的事件

除了簡單的操做和豐富的API之外,咱們在裝載視頻時,無需進行編碼,播放完成後也無需手動回收資源。佈局

除了播放視頻,Media Controller類則爲咱們提供了一個懸浮的操做欄,包含了播放,暫停,快進,快退,上一個,下一個等功能鍵。甚至連拖動進度條至某處播放都已經實現。在使用前VideoView和MediController須要相互指定控件。其內置方法有以下:this

  • boolean isShowing:當前懸浮控制欄是否顯示
  • setMediaPlayer(MediaController.MediaPlayerControl player):設置控制的組件
  • setPrevNextListeners(View.OnClickListener next,View.OnClickListener prev):設置上一個視頻、下一個視頻的切換事件。

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

3、使用VideoView實現視頻播放

下面咱們將展現如何使用VideoView播放香港衛視的視頻流:spa

1. 聲明權限

須要在AndroidManifest.xml添加兩條權限。設計

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

兩條權限分別爲:網絡訪問權限、訪問文件系統的權限。3d

2. 編寫VideoView佈局

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <VideoView
            android:id="@+id/video_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
</android.support.constraint.ConstraintLayout>

3. 編寫播放視頻代碼

VideoView videoView = findViewById(R.id.video_view);
videoView.setVideoPath("http://live.hkstv.hk.lxdns.com/live/hks/playlist.m3u8");  // 香港衛視地址
videoView.start();
MediaController mediaController = new MediaController(this);
videoView.setMediaController(mediaController);
mediaController.setMediaPlayer(videoView);

4. 效果圖

完成代碼編寫的工做後啓動App應該就可以如上圖的香港衛視的視頻內容啦。是否是感受很簡單啊,那是由於VideoView封裝了MediaPlayer和SurfaceView,全部的生命週期都包裝好了,因此使用的時候固然就簡單啦。下面咱們就解析一下VideoView瞭解其背後的事情。code

4、VideoView 播放狀態說明

下面的代碼是VideoView聲明的播放器聲明的狀態:

// all possible internal states
private static final int STATE_ERROR = -1; 
private static final int STATE_IDLE = 0;    
private static final int STATE_PREPARING = 1;  
private static final int STATE_PREPARED = 2; 
private static final int STATE_PLAYING = 3;
private static final int STATE_PAUSED = 4;
private static final int STATE_PLAYBACK_COMPLETED = 5;

爲何會聲明這些狀態,這就不得不提到MediaPlayer的生命週期了,看下圖,應該就稍微理解了吧:

在這裏咱們先不具體針對這個圖講MediaPlayer的生命週期的內容。只是爲了證實VideoView的狀態的生命是有依據的。

private int mCurrentState = STATE_IDLE;
private int mTargetState = STATE_IDLE;

上面的代碼聲明瞭兩個狀態變量,分別是當前的狀態和目標狀態。經過這兩個變量結合上面提到的常量,咱們能夠很清楚的知道VideoView類就是圍繞這這兩個狀態來進行相應的操做的。而咱們處理一些回調也是基於這些狀態之間的變化設計的,如:

  • OnCompletionListener -- STATE_PLAYBACK_COMPLETED
  • OnPreparedListener -- STATE_PREPARED
  • OnErrorListener -- STATE_ERROR

 5、使用VideoView 可能遇到的問題及解決方案

1. 視頻播放時會有短暫的黑屏時間: 

產生緣由:

視頻文件加載到內存中是須要時間,這個時間可能導入VideoView全黑。

解決方法:

(1):給VideoView添加MediaPlayer.OnPreparedListener 監聽事件,在其onPrepared(MediaPlayer mp) 方法回調中播放視頻這個時候視頻已經完成了加載。
(2):在VideoView執行start() 方法時視頻的預覽圖不是當即消失而是延遲幾百毫秒以後消失,這是視頻已經加載完成,固然體驗上有些很差。

2. 跳轉到其餘界面回來後視頻播放區域黑屏:

產生緣由:

VideoView被回收掉,而本身沒作VideoView的狀態保存處理

解決方法:

在VideoView所在的Activity或者Fragment的生命週期中處理VideoView視頻播放和暫停。(查看VideoView的生命週期相關的方法)

相關文章
相關標籤/搜索