Android 使用ExoPlayer視訊播放 (一)
一、前言
ExoPlayer是google開源的應用級媒體播放器專案,目前已有1W+的start,並一直在維護。該開源專案包含ExoPlayer庫和演示
demo,github地址:https://github.com/google/ExoPlayer。
二、優缺點比較
與Android內建的MediaPlayer相比,ExoPlayer具有許多優點:
*支援通過HTTP(DASH)和SmoothStreaming進行動態自適應流,這兩種都不受MediaPlayer的支援。還支援許多其他格式
*能夠自定義和擴充套件播放器,以適應各種不同需求。 ExoPlayer專門設計了這一點,大部分元件都可以自己替換
*官網說了很多,其實說到底最主要的就是各個元件可以自定義,還可以接入ffmpeg元件,基本能滿足99.9%的需求
與IJKPlayer和Vitamio相比,ExoPlayer具有的優點:
*匯入專案之後APK體積增加小
缺點:
*最低支援版本4.4
*實現比較複雜
三、概述
ExoPlayer庫的核心是Exoplayer介面,Exoplayer公開了傳統的高階媒體播放器功能,例如緩衝媒體、播放、
暫停和seek等功能,ExoPlayer通過元件實現替他高階功能。ExoPlayer公同的元件有:
*MediaSource:定義多媒體資料來源,從Uri中讀取資料,傳入ExoPlayer。
*TrackSelector:軌道提取器,從MediaSource中提取各個軌道的二進位制資料,交給Render渲染。
*LoadControl:可以控制MediaSource,比如什麼時候開始緩衝,緩衝多少之後暫停緩衝
四、入門
1、新增依賴
專案根目錄中的build.gradle檔案中包含jcenter倉庫:
repositories {
jcenter()
}
用app模組的build.gradle檔案中新增ExoPlayer庫的依賴:
compile 'com.google.android.exoplayer:exoplayer:r2.X.X'
2、建立播放器
// 建立頻寬
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
// 建立軌道選擇工廠
TrackSelection.Factory videoTrackSelectionFactory = new A
// 建立軌道選擇例項
TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
// 建立播放器例項
SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
3、新增SimpleExoPlayerView,繫結SimpleExoPlayer
在XML檔案中新增SimpleExoPlayerView控制元件,此控制元件實現了視訊播放的基本介面,內部包含了PlaybackControlView,實現了對視訊播放的基本控制。新增SimpleExoPlayerView之後繫結SimpleExoPlayer
simpleExoPlayerView.setPlayer(player);
4、準備並開始播放器
// 建立載入資料的工廠
dataSourceFactory = new DefaultDataSourceFactory(this,Util.getUserAgent(this,"MyApplication"),null);
Uri uri = Uri.parse(url);
// 建立資源
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);
}
}