GSYExo2MediaPlayer.java 7.2 KB
Newer Older
1 2 3 4
package com.example.gsyvideoplayer.exo;

import android.content.Context;
import android.net.Uri;
5 6
import android.os.Handler;
import android.os.Looper;
7 8

import com.google.android.exoplayer2.C;
9 10
import com.google.android.exoplayer2.DefaultLoadControl;
import com.google.android.exoplayer2.DefaultRenderersFactory;
G
guoshuyu 已提交
11
import com.google.android.exoplayer2.SimpleExoPlayer;
12 13 14
import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.source.ConcatenatingMediaSource;
import com.google.android.exoplayer2.source.MediaSource;
15
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
S
shuyu 已提交
16 17
import com.shuyu.gsyvideoplayer.utils.Debuger;

18 19 20 21
import java.io.FileDescriptor;
import java.util.List;
import java.util.Map;

G
guoshuyu 已提交
22
import tv.danmaku.ijk.media.exo2.IjkExo2MediaPlayer;
23
import tv.danmaku.ijk.media.exo2.demo.EventLogger;
S
shuyu 已提交
24
import tv.danmaku.ijk.media.player.IMediaPlayer;
25 26 27 28

/**
 * 自定义exo player,实现不同于库的exo 无缝切换效果
 */
G
guoshuyu 已提交
29
public class GSYExo2MediaPlayer extends IjkExo2MediaPlayer {
30 31 32

    private static final String TAG = "GSYExo2MediaPlayer";

G
guoshuyu 已提交
33
    private static final long MAX_POSITION_FOR_SEEK_TO_PREVIOUS = 3000;
34

G
guoshuyu 已提交
35
    private final Timeline.Window window = new Timeline.Window();
36

S
shuyu 已提交
37 38
    public static final int POSITION_DISCONTINUITY = 899;

39 40
    private int playIndex = 0;

41
    public GSYExo2MediaPlayer(Context context) {
G
guoshuyu 已提交
42
        super(context);
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
    }

    @Override
    @Deprecated
    public void setDataSource(Context context, Uri uri) {
        throw new UnsupportedOperationException("Deprecated, try setDataSource(List<String> uris, Map<String, String> headers)");
    }

    @Override
    @Deprecated
    public void setDataSource(Context context, Uri uri, Map<String, String> headers) {
        throw new UnsupportedOperationException("Deprecated, try setDataSource(List<String> uris, Map<String, String> headers)");
    }

    @Override
G
guoshuyu 已提交
58
    @Deprecated
59 60 61 62 63
    public void setDataSource(String path) {
        throw new UnsupportedOperationException("Deprecated, try setDataSource(List<String> uris, Map<String, String> headers)");
    }

    @Override
G
guoshuyu 已提交
64
    @Deprecated
65 66 67 68
    public void setDataSource(FileDescriptor fd) {
        throw new UnsupportedOperationException("Deprecated, try setDataSource(List<String> uris, Map<String, String> headers)");
    }

S
shuyu 已提交
69 70 71 72 73 74
    @Override
    public void onPositionDiscontinuity(int reason) {
        super.onPositionDiscontinuity(reason);
        notifyOnInfo(POSITION_DISCONTINUITY, reason);
    }

75
    public void setDataSource(List<String> uris, Map<String, String> headers, int index, boolean cache) {
76
        mHeaders = headers;
G
guoshuyu 已提交
77
        if (uris == null) {
78 79 80 81
            return;
        }
        ConcatenatingMediaSource concatenatedSource = new ConcatenatingMediaSource();
        for (String uri : uris) {
82
            MediaSource mediaSource = mExoHelper.getMediaSource(uri, isPreview, cache, false, mCacheDir, getOverrideExtension());
83 84
            concatenatedSource.addMediaSource(mediaSource);
        }
85
        playIndex = index;
86 87 88
        mMediaSource = concatenatedSource;
    }

89 90


G
guoshuyu 已提交
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
    /**
     * 上一集
     */
    public void previous() {
        if (mInternalPlayer == null) {
            return;
        }
        Timeline timeline = mInternalPlayer.getCurrentTimeline();
        if (timeline.isEmpty()) {
            return;
        }
        int windowIndex = mInternalPlayer.getCurrentWindowIndex();
        timeline.getWindow(windowIndex, window);
        int previousWindowIndex = mInternalPlayer.getPreviousWindowIndex();
        if (previousWindowIndex != C.INDEX_UNSET
                && (mInternalPlayer.getCurrentPosition() <= MAX_POSITION_FOR_SEEK_TO_PREVIOUS
                || (window.isDynamic && !window.isSeekable))) {
            mInternalPlayer.seekTo(previousWindowIndex, C.TIME_UNSET);
        } else {
            mInternalPlayer.seekTo(0);
        }
    }

114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
    @Override
    protected void prepareAsyncInternal() {
        new Handler(Looper.getMainLooper()).post(
                new Runnable() {
                    @Override
                    public void run() {
                        if (mTrackSelector == null) {
                            mTrackSelector = new DefaultTrackSelector();
                        }
                        mEventLogger = new EventLogger(mTrackSelector);
                        boolean preferExtensionDecoders = true;
                        boolean useExtensionRenderers = true;//是否开启扩展
                        @DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode = useExtensionRenderers
                                ? (preferExtensionDecoders ? DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER
                                : DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON)
                                : DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF;
                        if (mRendererFactory == null) {
                            mRendererFactory = new DefaultRenderersFactory(mAppContext);
                            mRendererFactory.setExtensionRendererMode(extensionRendererMode);
                        }
                        if (mLoadControl == null) {
                            mLoadControl = new DefaultLoadControl();
                        }
G
guoshuyu 已提交
137 138 139 140 141
                        mInternalPlayer = new SimpleExoPlayer.Builder(mAppContext, mRendererFactory)
                                .setLooper(Looper.getMainLooper())
                                .setTrackSelector(mTrackSelector)
                                .setLoadControl(mLoadControl).build();

142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
                        mInternalPlayer.addListener(GSYExo2MediaPlayer.this);
                        mInternalPlayer.addAnalyticsListener(GSYExo2MediaPlayer.this);
                        mInternalPlayer.addListener(mEventLogger);
                        if (mSpeedPlaybackParameters != null) {
                            mInternalPlayer.setPlaybackParameters(mSpeedPlaybackParameters);
                        }
                        if (mSurface != null)
                            mInternalPlayer.setVideoSurface(mSurface);
                        ///fix start index
                        if (playIndex > 0) {
                            mInternalPlayer.seekTo(playIndex, C.INDEX_UNSET);
                        }
                        mInternalPlayer.prepare(mMediaSource, false, false);
                        mInternalPlayer.setPlayWhenReady(false);
                    }
                }
        );
    }

G
guoshuyu 已提交
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
    /**
     * 下一集
     */
    public void next() {
        if (mInternalPlayer == null) {
            return;
        }
        Timeline timeline = mInternalPlayer.getCurrentTimeline();
        if (timeline.isEmpty()) {
            return;
        }
        int windowIndex = mInternalPlayer.getCurrentWindowIndex();
        int nextWindowIndex = mInternalPlayer.getNextWindowIndex();
        if (nextWindowIndex != C.INDEX_UNSET) {
            mInternalPlayer.seekTo(nextWindowIndex, C.TIME_UNSET);
        } else if (timeline.getWindow(windowIndex, window, false).isDynamic) {
            mInternalPlayer.seekTo(windowIndex, C.TIME_UNSET);
        }
    }

S
shuyu 已提交
181 182 183 184
    public int getCurrentWindowIndex() {
        if (mInternalPlayer == null) {
            return 0;
        }
185
        return mInternalPlayer.getCurrentWindowIndex();
S
shuyu 已提交
186
    }
187
}