ExoPlayer簡單使用

1、介紹

ExoPlayer是google開源的應用級媒體播放器項目,該開源項目包含ExoPlayer庫和演示demo,github地址:https://github.com/google/ExoPlayerjava

2、概述

ExoPlayer庫的核心是ExoPlayer接口。ExoPlayer公開了傳統的高水平媒體播放器的功能,例如媒體緩衝,播放,暫停和快進功能。ExoPlayer沒有直接實現媒體文件的加載和渲染,而是把這些工做委託給了在建立播放器或者播放器準備好播放的時候注入的組件。全部ExoPlayer實現的通用組件是:android

  • MediaSource:媒體資源,用於定義要播放的媒體,加載媒體,以及從哪裏加載媒體。簡單的說,MediaSource就是表明咱們要播放的媒體文件,能夠是本地資源,能夠是網絡資源。MediaSource在播放開始的時候,經過ExoPlayer.prepare方法注入。
  • Renderer:渲染器,用於渲染媒體文件。當建立播放器的時候,Renderers被注入。
  • TrackSelector:軌道選擇器,用於選擇MediaSource提供的軌道(tracks),供每一個可用的渲染器使用。
  • LoadControl:用於控制MediaSource什麼時候緩衝更多的媒體資源以及緩衝多少媒體資源。LoadControl在建立播放器的時候被注入。

3、使用

一、添加依賴

implementation 'com.google.android.exoplayer:exoplayer:2.X.X'

此種方式依賴了整個ExoPlayer庫。咱們也能夠只依賴本身真正須要的庫。例若是你要播放普通的媒體資源,你能夠只依賴Core,UI這兩個個庫。git

implementation 'com.google.android.exoplayer:exoplayer-core:2.X.X'
implementation 'com.google.android.exoplayer:exoplayer-ui:2.X.X'

整個ExoPlayer庫包括5個子庫,依賴了整個ExoPlayer庫和依賴5個子庫是等效的。github

  • exoplayer-core:核心功能 (必要)
  • exoplayer-dash:支持DASH內容
  • exoplayer-hls:支持HLS內容
  • exoplayer-smoothstreaming:支持SmoothStreaming內容
  • exoplayer-ui:用於ExoPlayer的UI組件和相關的資源。

  二、在佈局文件中加入PlayerView

<com.google.android.exoplayer2.ui.PlayerView
    android:id="@+id/exo_play_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
private PlayerView mPlayerView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    [...]
    mPlayerView = findViewById(R.id.exo_play_view);
}

三、 建立播放器SimpleExoPlayer實例

SimpleExoPlayer是ExoPlayer接口的一個默認的通用實現。

// 獲得默認合適的帶寬
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
// 建立跟蹤的工廠
TrackSelection.Factory factory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
// 建立跟蹤器
DefaultTrackSelector trackSelection = new DefaultTrackSelector(factory);

// 建立播放器
SimpleExoPlayer exoPlayer = ExoPlayerFactory.newSimpleInstance(context, trackSelection);

// 第二種方式 傳入了默認的渲染工廠(DefaultRenderersFactory),默認的軌道選擇器(DefaultTrackSelector)和默認的加載控制器(DefaultLoadControl),而後把返回的播放器實例
//SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(
//         new DefaultRenderersFactory(context),
//         new DefaultTrackSelector(), 
//         new DefaultLoadControl());

四、準備並開始播放

// 生成數據媒體實例,經過該實例加載媒體數據
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, Util.getUserAgent(context, "exoplayerdemo"));
// 建立資源
Uri uri = Uri.parse(url);
MediaSource mediaSources = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
// 將播放器附加到view
mPlayerView.setPlayer(exoPlayer);
// 準備播放
exoPlayer.prepare(mediaSource);
// 準備好了以後自動播放,若是已經準備好了,調用該方法實現暫停、開始功能
exoPlayer.setPlayWhenReady(true);

五、釋放播放器

if (null != exoPlayer) {
    exoPlayer.stop();
    exoPlayer.release();
    exoPlayer = null;
}

六、組合媒體資源

ExoPlayer庫提供了ConcatenatingMediaSource和DynamicConcatenatingMediaSource能夠用來無縫的合併播放多個媒體資源。網絡

使用ConcatenatingMediaSource
下面的方法構建了組合的媒體文件。app

/**
 * list是資源地址集合,能夠是音頻、視頻等
 */
private MediaSource getMediaSource(ArrayList<String> list) {
    DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, Util.getUserAgent(context, "exoplayerdemo"));
    // 將URL組裝成資源類
    MediaSource[] mediaSources = new MediaSource[list.size()];
    for (int i = 0; i < list.size(); i++) {
        Uri uri = Uri.parse(list.get(i));
        mediaSources[i] = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
    }
    MediaSource mediaSource = mediaSources.length == 1 ? mediaSources[0] : new ConcatenatingMediaSource(mediaSources);
    return mediaSource;
}

七、循環播放

ExoPlayer庫提供了LoopingMediaSource實現循環播放。ide

// 單個資源循環播放 可指定loopCount循環次數
MediaSource source = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
MediaSource mediaSource = new LoopingMediaSource(source, loopCount);

// 多個資源循環播放
MediaSource source = new ConcatenatingMediaSource(mediaSources);
MediaSource mediaSource = new LoopingMediaSource(source, loopCount);

八、監聽ExoPlayer事件

// 添加事件監聽
exoPlayer.addListener(listener);
// 移除事件監聽
exoPlayer.removeListener(listener);

private Player.DefaultEventListener listener = new Player.DefaultEventListener() {
    @Override
    public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
        // 視頻播放狀態
        L.d("playbackState = " + playbackState + " playWhenReady = " + playWhenReady);
        switch (playbackState){
            case Player.STATE_IDLE:
                // 空閒
                break;
            case Player.STATE_BUFFERING:
                // 緩衝中
                break;
            case Player.STATE_READY:
                // 準備好
                break;
            case Player.STATE_ENDED:
                // 結束
                break;
            default:
                break;
        }
    }

    @Override
    public void onPlayerError(ExoPlaybackException error) {
        // 報錯
        switch (error.type){
            case ExoPlaybackException.TYPE_SOURCE:
                // 加載資源時出錯
                break;
            case ExoPlaybackException.TYPE_RENDERER:
                // 渲染時出錯
                break;
            case ExoPlaybackException.TYPE_UNEXPECTED:
                // 意外的錯誤
                break;
        }
    }
};

九、自定義界面

若是不設置的話,ExoPlayer 默認使用的播放控制界面是PlayerControlView若是徹底不想使用這個控制界面,能夠在佈局文件裏面修改oop

<com.google.android.exoplayer2.ui.PlayerView
   [...]
   app:use_controller="false"/>

這樣控制界面就不顯示了。佈局

自定義PlayerControlView的行爲ui

<com.google.android.exoplayer2.ui.PlayerView
   android:id="@+id/video_view"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   app:show_timeout="10000"
   app:fastforward_increment="30000"
   app:rewind_increment="30000"/>

上面的例子中,快進和快退都改爲了30秒。控制界面自動消失時間是10秒。

自定義PlayerControlView界面的外觀

你能夠自定義控制界面,而後在佈局文件裏更改屬性 controller_layout_id。

<com.google.android.exoplayer2.ui.PlayerView  
   android:id="@+id/video_view"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   app:controller_layout_id="@layout/custom_playback_control"/>
PlayerControlView經過id來識別它使用的全部UI元素。當你自定義佈局文件的時候,必須保持標準元素的id,例如@id/exo_play 或 @id/exo_pause,以便讓PlayerControlView有機會找到它們。

默認的PlayerControlView的控制界面是R.layout.exo_playback_control_view.xml。你也能夠直接從ExoPlayer庫中複製到app的res目錄下面,而後作相應的更改便可。

4、結尾

基本的播放差很少已經完成了。ExoPlayer還有不少高級功能,例如

一、資源剪切 ClippingMediaSource
二、倍速播放
三、字幕
四、播放流媒體
等等等等

尚未研究,有興趣的小夥伴能夠去看看。

相關文章
相關標籤/搜索