提交 0e4651df 编写于 作者: G guoshuyu

##2550 调整初始化 index 设置不对问题

上级 a21600bd
......@@ -48,6 +48,7 @@ public class DetailExoListPlayer extends GSYBaseActivityDetail<GSYExo2PlayerView
urls.add(new GSYVideoModel("http://7xjmzj.com1.z0.glb.clouddn.com/20171026175005_JObCxCE2.mp4", "标题1"));
urls.add(new GSYVideoModel("https://media6.smartstudy.com/ae/07/3997/2/dest.m3u8", "标题3"));
urls.add(new GSYVideoModel("http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4", "标题2"));
//detailPlayer.setUp(urls, 1);
detailPlayer.setUp(urls, 0);
//使用 exo 的 CacheDataSourceFactory 实现
......
......@@ -2,11 +2,17 @@ package com.example.gsyvideoplayer.exo;
import android.content.Context;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.DefaultLoadControl;
import com.google.android.exoplayer2.DefaultRenderersFactory;
import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.source.ConcatenatingMediaSource;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.shuyu.gsyvideoplayer.utils.Debuger;
import java.io.FileDescriptor;
......@@ -14,6 +20,7 @@ import java.util.List;
import java.util.Map;
import tv.danmaku.ijk.media.exo2.IjkExo2MediaPlayer;
import tv.danmaku.ijk.media.exo2.demo.EventLogger;
import tv.danmaku.ijk.media.player.IMediaPlayer;
/**
......@@ -29,6 +36,8 @@ public class GSYExo2MediaPlayer extends IjkExo2MediaPlayer {
public static final int POSITION_DISCONTINUITY = 899;
private int playIndex = 0;
public GSYExo2MediaPlayer(Context context) {
super(context);
}
......@@ -63,19 +72,22 @@ public class GSYExo2MediaPlayer extends IjkExo2MediaPlayer {
notifyOnInfo(POSITION_DISCONTINUITY, reason);
}
public void setDataSource(List<String> uris, Map<String, String> headers, boolean cache) {
public void setDataSource(List<String> uris, Map<String, String> headers, int index, boolean cache) {
mHeaders = headers;
if (uris == null) {
return;
}
ConcatenatingMediaSource concatenatedSource = new ConcatenatingMediaSource();
for (String uri : uris) {
MediaSource mediaSource = mExoHelper.getMediaSource(uri, isPreview, cache, false, mCacheDir, getOverrideExtension());
MediaSource mediaSource = mExoHelper.getMediaSource(uri, isPreview, cache, false, mCacheDir, getOverrideExtension());
concatenatedSource.addMediaSource(mediaSource);
}
playIndex = index;
mMediaSource = concatenatedSource;
}
/**
* 上一集
*/
......@@ -99,6 +111,49 @@ public class GSYExo2MediaPlayer extends IjkExo2MediaPlayer {
}
}
@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();
}
mInternalPlayer = ExoPlayerFactory.newSimpleInstance(mAppContext, mRendererFactory, mTrackSelector, mLoadControl, null, Looper.getMainLooper());
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);
}
}
);
}
/**
* 下一集
*/
......@@ -123,6 +178,6 @@ public class GSYExo2MediaPlayer extends IjkExo2MediaPlayer {
if (mInternalPlayer == null) {
return 0;
}
return mInternalPlayer.getCurrentWindowIndex();
return mInternalPlayer.getCurrentWindowIndex();
}
}
......@@ -30,10 +30,10 @@ import static com.example.gsyvideoplayer.exo.GSYExo2MediaPlayer.POSITION_DISCONT
/**
Created by guoshuyu on 2018/5/16.
自定义View支持exo的list数据,实现无缝切换效果
这是一种思路,通过自定义后GSYExo2MediaPlayer内部,通过ConcatenatingMediaSource实现列表播放
诸如此类,还可以实现AdsMediaSource等
* Created by guoshuyu on 2018/5/16.
* 自定义View支持exo的list数据,实现无缝切换效果
* 这是一种思路,通过自定义后GSYExo2MediaPlayer内部,通过ConcatenatingMediaSource实现列表播放
* 诸如此类,还可以实现AdsMediaSource等
*/
public class GSYExo2PlayerView extends StandardGSYVideoPlayer {
......@@ -43,7 +43,7 @@ public class GSYExo2PlayerView extends StandardGSYVideoPlayer {
protected boolean mExoCache = false;
/**
1.5.0开始加入,如果需要不同布局区分功能,需要重载
* 1.5.0开始加入,如果需要不同布局区分功能,需要重载
*/
public GSYExo2PlayerView(Context context, Boolean fullFlag) {
super(context, fullFlag);
......@@ -59,50 +59,50 @@ public class GSYExo2PlayerView extends StandardGSYVideoPlayer {
/**
设置播放URL
@param url 播放url
@param position 需要播放的位置
@return
* 设置播放URL
*
* @param url 播放url
* @param position 需要播放的位置
* @return
*/
public boolean setUp(List<GSYVideoModel> url, int position) {
return setUp(url, position, null, new HashMap<String, String>());
}
/**
设置播放URL
@param url 播放url
@param position 需要播放的位置
@param cachePath 缓存路径,如果是M3U8或者HLS,请设置为false
@return
* 设置播放URL
*
* @param url 播放url
* @param position 需要播放的位置
* @param cachePath 缓存路径,如果是M3U8或者HLS,请设置为false
* @return
*/
public boolean setUp(List<GSYVideoModel> url, int position, File cachePath) {
return setUp(url, position, cachePath, new HashMap<String, String>());
}
/**
设置播放URL
@param url 播放url
@param position 需要播放的位置
@param cachePath 缓存路径,如果是M3U8或者HLS,请设置为false
@param mapHeadData http header
@return
* 设置播放URL
*
* @param url 播放url
* @param position 需要播放的位置
* @param cachePath 缓存路径,如果是M3U8或者HLS,请设置为false
* @param mapHeadData http header
* @return
*/
public boolean setUp(List<GSYVideoModel> url, int position, File cachePath, Map<String, String> mapHeadData) {
return setUp(url, position, cachePath, mapHeadData, true);
}
/**
设置播放URL
@param url 播放url
@param position 需要播放的位置
@param cachePath 缓存路径,如果是M3U8或者HLS,请设置为false
@param mapHeadData http header
@param changeState 切换的时候释放surface
@return
* 设置播放URL
*
* @param url 播放url
* @param position 需要播放的位置
* @param cachePath 缓存路径,如果是M3U8或者HLS,请设置为false
* @param mapHeadData http header
* @param changeState 切换的时候释放surface
* @return
*/
protected boolean setUp(List<GSYVideoModel> url, int position, File cachePath, Map<String, String> mapHeadData, boolean changeState) {
mUriList = url;
......@@ -184,14 +184,14 @@ public class GSYExo2PlayerView extends StandardGSYVideoPlayer {
Debuger.printfError("********************** urls isEmpty . Do you know why ? **********************");
}
((GSYExoVideoManager) getGSYVideoManager()).prepare(urls, (mMapHeadData == null) ? new HashMap<String, String>() : mMapHeadData, mLooping, mSpeed, mExoCache, mCachePath, mOverrideExtension);
((GSYExoVideoManager) getGSYVideoManager()).prepare(urls, (mMapHeadData == null) ? new HashMap<String, String>() : mMapHeadData, mPlayPosition, mLooping, mSpeed, mExoCache, mCachePath, mOverrideExtension);
setStateAndUi(CURRENT_STATE_PREPAREING);
}
/**
显示wifi确定框,如需要自定义继承重写即可
* 显示wifi确定框,如需要自定义继承重写即可
*/
@Override
protected void showWifiDialog() {
......@@ -252,7 +252,7 @@ public class GSYExo2PlayerView extends StandardGSYVideoPlayer {
@Override
public void onInfo(int what, int extra) {
if (what == POSITION_DISCONTINUITY) {
int window = ((GSYExo2MediaPlayer)getGSYVideoManager().getPlayer().getMediaPlayer()).getCurrentWindowIndex();
int window = ((GSYExo2MediaPlayer) getGSYVideoManager().getPlayer().getMediaPlayer()).getCurrentWindowIndex();
mPlayPosition = window;
GSYVideoModel gsyVideoModel = mUriList.get(window);
if (!TextUtils.isEmpty(gsyVideoModel.getTitle())) {
......
......@@ -15,10 +15,12 @@ import java.util.Map;
public class GSYExoModel extends GSYModel {
List<String> urls = new ArrayList<>();
int index = 0;
public GSYExoModel(List<String> urls, Map<String, String> mapHeadData, boolean loop, float speed, boolean cache, File cachePath, String overrideExtension) {
public GSYExoModel(List<String> urls, Map<String, String> mapHeadData, int index, boolean loop, float speed, boolean cache, File cachePath, String overrideExtension) {
super("", mapHeadData, loop, speed, cache, cachePath, overrideExtension);
this.urls = urls;
this.index = index;
}
public List<String> getUrls() {
......
......@@ -43,7 +43,7 @@ public class GSYExoPlayerManager extends BasePlayerManager {
mediaPlayer.setLooping(((GSYExoModel) msg.obj).isLooping());
Debuger.printfError("###### " + ((GSYExoModel) msg.obj).getOverrideExtension());
mediaPlayer.setOverrideExtension(((GSYExoModel) msg.obj).getOverrideExtension());
mediaPlayer.setDataSource(((GSYExoModel) msg.obj).getUrls(), ((GSYExoModel) msg.obj).getMapHeadData(), ((GSYExoModel) msg.obj).isCache());
mediaPlayer.setDataSource(((GSYExoModel) msg.obj).getUrls(), ((GSYExoModel) msg.obj).getMapHeadData(), ((GSYExoModel) msg.obj).index, ((GSYExoModel) msg.obj).isCache());
//很遗憾,EXO2的setSpeed只能在播放前生效
if (((GSYExoModel) msg.obj).getSpeed() != 1 && ((GSYExoModel) msg.obj).getSpeed() > 0) {
mediaPlayer.setSpeed(((GSYExoModel) msg.obj).getSpeed(), 1);
......@@ -82,7 +82,7 @@ public class GSYExoPlayerManager extends BasePlayerManager {
@Override
public void setNeedMute(boolean needMute) {
if(mediaPlayer != null) {
if (mediaPlayer != null) {
if (needMute) {
mediaPlayer.setVolume(0, 0);
} else {
......@@ -102,7 +102,7 @@ public class GSYExoPlayerManager extends BasePlayerManager {
@Override
public void release() {
if(mediaPlayer != null) {
if (mediaPlayer != null) {
mediaPlayer.setSurface(null);
mediaPlayer.release();
}
......
......@@ -53,11 +53,11 @@ public class GSYExoVideoManager extends GSYVideoBaseManager {
return new GSYExoPlayerManager();
}
public void prepare(List<String> urls, Map<String, String> mapHeadData, boolean loop, float speed, boolean cache, File cachePath, String overrideExtension) {
public void prepare(List<String> urls, Map<String, String> mapHeadData, int index, boolean loop, float speed, boolean cache, File cachePath, String overrideExtension) {
if (urls.size() == 0) return;
Message msg = new Message();
msg.what = HANDLER_PREPARE;
msg.obj = new GSYExoModel(urls, mapHeadData, loop, speed, cache, cachePath, overrideExtension);
msg.obj = new GSYExoModel(urls, mapHeadData, index, loop, speed, cache, cachePath, overrideExtension);
sendMessage(msg);
if (needTimeOutOther) {
startTimeOutBuffer();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册