1. 程式人生 > >專案記錄: Exoplayer V2 dynamic-playlist使用

專案記錄: Exoplayer V2 dynamic-playlist使用

專案記錄: Exoplayer V2開發

dynamic-playlist使用與修改

建立 ConcatenatingMediaSource

Exoplayer V2 中的 initializePlayer() :

  • mediaSource = new ConcatenatingMediaSource(mediaSources);

動態新增 MediaSource

concatenatingMediaSource = (ConcatenatingMediaSource)mediaSource; // 獲得ConcatenatingMediaSource的引用
// 筆記:建立一個MediaSource String addString = new String("/storage/emulated/0/Download/3D_Rio_shark.MP4"); MediaSource addMediaSource = buildMediaSource(Uri.parse(addString)); concatenatingMediaSource.addMediaSource(addMediaSource);// 新增一個MediaSource到concatenatingMediaSource當中
  • 動態新增可以是多個;
  • 動態新增可以在任何時間進行;

準備播放器

// 準備播放器
player.prepare(mediaSource, !haveStartPosition, false);
  • 當呼叫 player.prepare 後, 則進入播放的過程.

Track the Playlist

  • 可以通過給 palyer 新增 監聽器 , 重寫 onPositionDiscontinuity 函式,那麼 playlist 從 一個 MediaSource 切換到另一個
  • MediaSource 時,就會呼叫這個函式.
int lastWindowIndex = 0; // global var in your class encapsulating exoplayer obj (Activity, etc.)

exoPlayer.addListener(new ExoPlayer.EventListener() {
    @Override
    public void onLoadingChanged(boolean isLoading) {
    }

    @Override
    public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
    }

    @Override
    public void onTimelineChanged(Timeline timeline, Object manifest) {
    }

    @Override
    public void onPlayerError(ExoPlaybackException error) {
    }

    @Override
    public void onPositionDiscontinuity() {
        //THIS METHOD GETS CALLED FOR EVERY NEW SOURCE THAT IS PLAYED
        int latestWindowIndex = exoPlayer.getCurrentWindowIndex();
        if (latestWindowIndex != lastWindowIndex) {
            // item selected in playlist has changed, handle here
            lastWindowIndex = latestWindowIndex;
            // ...
        }
    }
});
  • 示例:
  • 在切換的時候,建立新的 MediaSource , 並將其移動到 dynamic-playl 的隊首,呼叫 player.prepare 進行播放.
  • 實現了切換,但是會出現一個短暫的黑屏現象.
player.addListener(new Player.EventListener() {
    @Override
    public void onPositionDiscontinuity(int reason) {
        Log.e("jianzhao", "onPositionDiscontinuity::lastWindowIndex: " +lastWindowIndex);

        int latestWindowIndex = player.getCurrentWindowIndex();
        Log.e("jianzhao", "onPositionDiscontinuity::getCurrentWindowIndex: " +latestWindowIndex );

        if (latestWindowIndex != lastWindowIndex) {
            // item selected in playlist has changed, handle here
            lastWindowIndex = latestWindowIndex;

            //ConcatenatingMediaSource concatenatingMediaSource = (ConcatenatingMediaSource)mediaSource;\
            String addString=null;
            if(latestWindowIndex%2==0){
                addString = new String("/storage/emulated/0/Download/3D_Rio.MP4");
            }
            else{
                addString = new String("/storage/emulated/0/Download/3D_Rio_shark.MP4");
            }

            MediaSource addMediaSource = buildMediaSource(Uri.parse(addString));
            mediaSource.addMediaSource(addMediaSource);

            int Size = mediaSource.getSize();
            Log.e("jianzhao", "onPositionDiscontinuity::ConcatenatingMediaSource_Size: " +Size );

            mediaSource.moveMediaSource(Size-1,0);

            player.prepare(mediaSource);
        }
    }
});

參考文獻

[ExoPlayer 2 Playlist Listener]

Playlist refresh UI