天天看點

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庫的依賴:

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

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);
        }
    }