一、前言
ExoPlayer是google開源的應用級媒體播放器項目,目前已有1W+的start,并一直在維護。該開源項目包含ExoPlayer庫和演示
demo,github地址:https://github.com/google/ExoPlayer。
二、優(yōu)缺點比較
與Android內(nèi)置的MediaPlayer相比,ExoPlayer具有許多優(yōu)點:
*支持通過HTTP(DASH)和SmoothStreaming進行動態(tài)自適應流,這兩種都不受MediaPlayer的支持。還支持許多其他格式
*能夠自定義和擴展播放器,以適應各種不同需求。 ExoPlayer專門設計了這一點,大部分組件都可以自己替換
*官網(wǎng)說了很多,其實說到底最主要的就是各個組件可以自定義,還可以接入ffmpeg組件,基本能滿足99.9%的需求
與IJKPlayer和Vitamio相比,ExoPlayer具有的優(yōu)點:
*導入項目之后APK體積增加小
缺點:
*最低支持版本4.4
*實現(xiàn)比較復雜
三、概述
ExoPlayer庫的核心是Exoplayer接口,Exoplayer公開了傳統(tǒng)的高級媒體播放器功能,例如緩沖媒體、播放、
暫停和seek等功能,ExoPlayer通過組件實現(xiàn)替他高級功能。ExoPlayer公同的組件有:
*MediaSource:定義多媒體數(shù)據(jù)源,從Uri中讀取數(shù)據(jù),傳入ExoPlayer。
*TrackSelector:軌道提取器,從MediaSource中提取各個軌道的二進制數(shù)據(jù),交給Render渲染。
*LoadControl:可以控制MediaSource,比如什么時候開始緩沖,緩沖多少之后暫停緩沖
四、入門
1、添加依賴
項目根目錄中的build.gradle文件中包含jcenter倉庫:
repositories {
jcenter()
}
用app模塊的build.gradle文件中添加ExoPlayer庫的依賴:
compile 'com.google.android.exoplayer:exoplayer:r2.X.X'
2、創(chuàng)建播放器
// 創(chuàng)建帶寬
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
// 創(chuàng)建軌道選擇工廠
TrackSelection.Factory videoTrackSelectionFactory = new A
// 創(chuàng)建軌道選擇實例
TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
// 創(chuàng)建播放器實例
SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
3、添加SimpleExoPlayerView,綁定SimpleExoPlayer
在XML文件中添加SimpleExoPlayerView控件,此控件實現(xiàn)了視頻播放的基本界面,內(nèi)部包含了PlaybackControlView,實現(xiàn)了對視頻播放的基本控制。添加SimpleExoPlayerView之后綁定SimpleExoPlayer
simpleExoPlayerView.setPlayer(player);
4、準備并開始播放器
// 創(chuàng)建加載數(shù)據(jù)的工廠
dataSourceFactory = new DefaultDataSourceFactory(this,Util.getUserAgent(this,"MyApplication"),null);
Uri uri = Uri.parse(url);
// 創(chuàng)建資源
ExtractorMediaSource mediaSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
// 準備播放
player.prepare(mediaSource);
// 開始播放
player.setPlayWhenReady(true);
5、退出時釋放播放器
@Override
protected void onDestroy() {
super.onDestroy();
if (player != null) {
player.release();
}
}
6、離開界面時暫停播放
@Override
protected void onPause() {
super.onPause();
if (player != null) {
player.setPlayWhenReady(false);
}
}