项目记录: 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

猜你喜欢

转载自blog.csdn.net/qjh5606/article/details/85066022
今日推荐