前言
本篇文章主要介紹 Android 原生 VideoView,Google 開源視頻播放框架 ExoPlayer,Vitamio 視頻播放框架以及 Bilibili 開源視頻播放框架 ijkplayer 的使用方法和優缺點。
VideoView
VideoView 的使用非常簡單,播放視頻的步驟:
在界面佈局文件中定義 VideoView 組件,或在程序中創建 VideoView 組件
調用 VideoView 的如下兩個方法來加載指定的視頻:
setVidePath(String path):加載 path 文件代表的視頻
setVideoURI(Uri uri):加載 uri 所對應的視頻
調用 VideoView 的 start()、stop()、psuse() 方法來控制視頻的播放
ExoPlayer
用法
ExoPlayer 開源項目包含了 library 和 示例:
- ExoPlayer library - 這部分是核心的庫
- Demo app - 這部分是演示怎麼使用 ExoPlayer 的 Demo
ExoPlayer 庫的核心類是 ExoPlayer 類。該類維護了播放器的全局狀態 。比如如何獲取媒體數據,如何緩衝以及是怎樣的編碼格式。
ExoPlayer 基於 MediaCodec 和 AudioTrack 提供了默認的音視頻的 TrackRenderer 實現。所有的 renderers 都需要 SampleSource 對象,ExoPlayer 從 SampleSource 獲得 media samples 用於播放。下圖展示了 ExoPlayer 是如何配置組合這些組件用於播放音視頻的。
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 的使用步驟:
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
用法
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 的大小。