[Android] Android 視頻播放總結

前言

本篇文章主要介紹 Android 原生 VideoView,Google 開源視頻播放框架 ExoPlayer,Vitamio 視頻播放框架以及 Bilibili 開源視頻播放框架 ijkplayer 的使用方法和優缺點。

VideoView

VideoView 的使用非常簡單,播放視頻的步驟:

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

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

    • setVidePath(String path):加載 path 文件代表的視頻

    • setVideoURI(Uri uri):加載 uri 所對應的視頻

  3. 調用 VideoView 的 start()、stop()、psuse() 方法來控制視頻的播放

ExoPlayer

ExoPlayer Git 地址

用法

ExoPlayer 開源項目包含了 library 和 示例:

  • ExoPlayer library - 這部分是核心的庫
  • Demo app - 這部分是演示怎麼使用 ExoPlayer 的 Demo

ExoPlayer 庫的核心類是 ExoPlayer 類。該類維護了播放器的全局狀態 。比如如何獲取媒體數據,如何緩衝以及是怎樣的編碼格式。

ExoPlayer 基於 MediaCodec 和 AudioTrack 提供了默認的音視頻的 TrackRenderer 實現。所有的 renderers 都需要 SampleSource 對象,ExoPlayer 從 SampleSource 獲得 media samples 用於播放。下圖展示了 ExoPlayer 是如何配置組合這些組件用於播放音視頻的。
standard-model

ExoPlayer 庫提供了一些不同類型的 SampleSource 實例:

  • ExtractorSampleSource - 用於 MP3,M4A,WebM,MPEG-TS 和 AAC;
  • ChunkSampleSource - 用於 DASH 和平滑流的播放;
  • HlsSampleSource - 用於 HLS 播放;

在 ExoPlayer 的 Dome 中使用 DemoPlayer 對 ExoPlayer 進行了封裝,並提供了使用上述幾種 SampleSource 構建 TrackRenderer 的 Builder。

  • SmoothStreamingRendererBuilder
  • DashRendererBuilder
  • ExtractorRendererBuilder

在使用的時候我們根據不同的需求創建對應的 RendererBuilder,然後將 RendererBuilder 傳遞給 DemoPlayer 然後調用 DemoPlayer 的 setPlayWhenReady 方法。

優缺點

ExoPlayer 相較於 MediaPlayer 有很多很多的優點:

  • 支持動態的自適應流 HTTP (DASH) 和 平滑流,任何目前 MediaPlayer 支持的視頻格式(同時它還支持 HTTP 直播(HLS),MP4,MP3,WebM,M4A,MPEG-TS 和 AAC)。
  • 支持高級的 HLS 特性,例如正確處理 EXT-X-DISCONTINUITY 標籤;
  • 支持自定義和擴治你的使用場景。ExoPlayer 專門爲此設計;
  • 便於隨着 App 的升級而升級。因爲 ExoPlayer 是一個包含在你的應用中的庫,對於你使用哪個版本有完全的控制權,並且你可以簡單的跟隨應用的升級而升級;
  • 更少的適配性問題。

ExoPlayer 的缺點:

  • ExoPlayer 的音頻和視頻組件依賴 Android 的 MediaCodec 接口,該接口發佈於 Android4.1(API 等級 16)。因此它不能工作於之前的Android 版本。

Vitamio

Vitamio demo 地址

用法

Vitamio 的使用步驟:

1.下載 Vitamio 庫,並作爲工程依賴。

2.在 Activity 的 onCreate 方法中添加如下代碼,初始化 Vitamio 的解碼器

    @Override public void onCreate(Bundle icicle) {
      super.onCreate(icicle);
      if (!LibsChecker.checkVitamioLibs(this)) 
      return;
    }

3.在 AndroidManifest.xml 中聲明 InitActivity

    <activity android:name="io.vov.vitamio.activity.InitActivity" android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden"
    android:launchMode="singleTop" android:theme="@android:style/Theme.NoTitleBar"
    android:windowSoftInputMode="stateAlwaysHidden"/>

4.其餘步驟和使用 Android 原生的 VideoView 是一樣的。

優點

  • 強大,支持超多格式視頻和網絡視頻播放。
  • 使用簡單。調用非常簡單,方便使用。

其官方還給出了其他很多優點,但是個人覺得不足以成爲優點。

ijkplayer

ijkplayer 項目地址

用法

1.clone ijkplayer 項目到本地

2.編譯 ijkplayer

下面是我的編譯環境

  • 編譯環境 Mac OS X 10.10.5
  • Android
    • NDK – android-ndk-r10e
    • Android Studio 1.3.1
    • Gradle 2.4

編譯之前要安裝 homebrew, git, yasm。

    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
     brew install git
     brew install yasm

配置 NDK

    # add these lines to your ~/.bash_profile or ~/.profile
    # export ANDROID_SDK=<your sdk path>
    # export ANDROID_NDK=<your ndk path>

clone 項目

    git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android

編譯 ffmpeg

    cd ijkplayer-android 
    ./init-android.sh 
    cd config
    rm module.sh
    ln -s module-default.sh module.sh
    cd android/contrib
    ./compile-ffmpeg.sh clean
    ./compile-ffmpeg.sh all

ffmpeg 編譯通過後,編譯 ijkplayer

    cd ..
    ./compile-ijk.sh all

編譯通過後在 android 目錄下有 ijkplayer 文件夾,這個是 ijkplayer 的 demo。導入 Android Studio 即可。ijkplayer 的 demo 中提供了 IjkVideoView 類,它封裝了 Android 原生的 MediaPlayer 、ExoPlayer 和 IjkMediaPlayer。可根據需要選擇。

優缺點

  • ijkplayer 最大的優點就是可以根據需要編譯需要的解碼器。在編譯的時候通過 ln -s module-default.sh module.sh 選擇要編譯的解碼器。ijkplayer 在 config 目錄下提供了三種 module.sh 。也可自己修改 module.sh 。

  • ijkplayer 的缺點是庫太大。加入項目後會大大增加你的 APP 的大小。

發佈了29 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章