1. 程式人生 > >Android 使用ExoPlayer視訊播放 (一)

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