提交 fe783659 编写于 作者: G guoshuyu

ExoPlayer 支持looping

上级 dd1bc77c
......@@ -131,6 +131,9 @@ compile 'com.shuyu:gsyVideoPlayer-ex_so:4.1.3'
<img src="https://github.com/CarGuo/GSYVideoPlayer/blob/master/07.gif" height="240px"/>
## 五、近期版本
### 4.1.4(2018-XX-XX)
* update ExoPlayer to 2.8.0
* 优化ExoPlayer的问题,增加ExoPlayer循环播放支持
### 4.1.3(2018-05-11)
* 优化单双击
......@@ -144,30 +147,6 @@ compile 'com.shuyu:gsyVideoPlayer-ex_so:4.1.3'
public void setAutoFullWithSize(boolean autoFullWithSize)
```
### 4.1.2(2018-04-14)
* 修复已知问题。
* 增加ijkplayer的raw播放支持。
```
String url = "android.resource://" + getPackageName() + "/" + R.raw.test;
GSYVideoManager.instance().enableRawPlay(getApplicationContext());
```
* danmku分支提供网络弹幕demo
### 4.1.1 (2018-04-01)
* 1、update support lib to 26.0.2
* 2、修复了渲染层在某些条件下,截图时返回大小不对问题。
* 3、一些细节的优化处理。
* 4、增加Manager的isFullState方法
```
/*
* 当前是否全屏状态
*
* @return 当前是否全屏状态, true代表是。
*/
public static boolean isFullState(Activity activity)
```
### 更多版本请查阅:[版本更新说明](https://github.com/CarGuo/GSYVideoPlayer/blob/master/UPDATE_VERSION.md)
## 六、关于Issues
......
## 下方个版本说明,可以当做简单的wiki使用~,效果可参考DEMO。
### 4.1.4(2018-XX-XX)
* update ExoPlayer to 2.8.0
* 优化ExoPlayer的问题
### 4.1.3(2018-05-11)
* 优化单双击
* update support and build sdk to 27
......
......@@ -154,7 +154,7 @@ public class ListNormalAdapter extends BaseAdapter {
holder.gsyVideoPlayer.setShowFullAnimation(!getListNeedAutoLand());
holder.gsyVideoPlayer.setIsTouchWiget(false);
//循环
//holder.gsyVideoPlayer.setLooping(true);
holder.gsyVideoPlayer.setLooping(true);
holder.gsyVideoPlayer.setNeedLockFull(true);
//holder.gsyVideoPlayer.setSpeed(2);
......
......@@ -41,6 +41,7 @@ public class EXO2PlayerManager implements IPlayerManager {
dummySurface = DummySurface.newInstanceV17(context, false);
}
try {
mediaPlayer.setLooping(((GSYModel) msg.obj).isLooping());
mediaPlayer.setDataSource(context, Uri.parse(((GSYModel) msg.obj).getUrl()), ((GSYModel) msg.obj).getMapHeadData());
//很遗憾,EXO2的setSpeed只能在播放前生效
if (((GSYModel) msg.obj).getSpeed() != 1 && ((GSYModel) msg.obj).getSpeed() > 0) {
......
......@@ -31,6 +31,7 @@ import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.DefaultLoadControl;
import com.google.android.exoplayer2.DefaultRenderersFactory;
import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.Player;
......@@ -42,6 +43,7 @@ import com.google.android.exoplayer2.ext.rtmp.RtmpDataSourceFactory;
import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory;
import com.google.android.exoplayer2.metadata.Metadata;
import com.google.android.exoplayer2.source.ExtractorMediaSource;
import com.google.android.exoplayer2.source.LoopingMediaSource;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.MediaSourceEventListener;
import com.google.android.exoplayer2.source.TrackGroupArray;
......@@ -66,7 +68,6 @@ import java.util.HashMap;
import java.util.Map;
import tv.danmaku.ijk.media.exo2.demo.EventLogger;
import tv.danmaku.ijk.media.exo2.demo.player.SimpleExoPlayer2;
import tv.danmaku.ijk.media.player.AbstractMediaPlayer;
import tv.danmaku.ijk.media.player.IMediaPlayer;
import tv.danmaku.ijk.media.player.MediaInfo;
......@@ -98,6 +99,7 @@ public class IjkExo2MediaPlayer extends AbstractMediaPlayer implements Player.Ev
private boolean lastReportedPlayWhenReady;
private boolean mIsPrepareing = true;
private boolean mIsBuffering = false;
private boolean isLooping = false;
private int audioSessionId = C.AUDIO_SESSION_ID_UNSET;
......@@ -193,7 +195,7 @@ public class IjkExo2MediaPlayer extends AbstractMediaPlayer implements Player.Ev
renderersFactory = new DefaultRenderersFactory(mAppContext, extensionRendererMode);
DefaultLoadControl loadControl = new DefaultLoadControl();
mInternalPlayer = SimpleExoPlayer2.createSimpleExoPlayer2(renderersFactory, mTrackSelector, loadControl, null);
mInternalPlayer = ExoPlayerFactory.newSimpleInstance(renderersFactory, mTrackSelector, loadControl, null);
mInternalPlayer.addListener(this);
mInternalPlayer.addAnalyticsListener(this);
mInternalPlayer.addListener(mEventLogger);
......@@ -316,14 +318,12 @@ public class IjkExo2MediaPlayer extends AbstractMediaPlayer implements Player.Ev
@Override
public void setLooping(boolean looping) {
// TODO: no support
throw new UnsupportedOperationException("no support");
isLooping = looping;
}
@Override
public boolean isLooping() {
// TODO: no support
return false;
return isLooping;
}
@Override
......@@ -428,38 +428,39 @@ public class IjkExo2MediaPlayer extends AbstractMediaPlayer implements Player.Ev
private MediaSource getMediaSource(boolean preview) {
Uri contentUri = Uri.parse(mDataSource);
int contentType = inferContentType(mDataSource);
MediaSource mediaSource;
switch (contentType) {
case C.TYPE_SS: {
MediaSource mediaSource = new SsMediaSource.Factory(
case C.TYPE_SS:
mediaSource = new SsMediaSource.Factory(
new DefaultSsChunkSource.Factory(getDataSourceFactory(preview)),
new DefaultDataSourceFactory(mAppContext, null,
getHttpDataSourceFactory(preview))).createMediaSource(contentUri);
return mediaSource;
}
case C.TYPE_DASH: {
MediaSource mediaSource = new DashMediaSource.Factory(new DefaultDashChunkSource.Factory(getDataSourceFactory(preview)),
break;
case C.TYPE_DASH:
mediaSource = new DashMediaSource.Factory(new DefaultDashChunkSource.Factory(getDataSourceFactory(preview)),
new DefaultDataSourceFactory(mAppContext, null,
getHttpDataSourceFactory(preview))).createMediaSource(contentUri);
return mediaSource;
}
case C.TYPE_HLS: {
MediaSource mediaSource = new HlsMediaSource.Factory(getDataSourceFactory(preview)).createMediaSource(contentUri);
return mediaSource;
}
case TYPE_RTMP: {
break;
case C.TYPE_HLS:
mediaSource = new HlsMediaSource.Factory(getDataSourceFactory(preview)).createMediaSource(contentUri);
break;
case TYPE_RTMP:
RtmpDataSourceFactory rtmpDataSourceFactory = new RtmpDataSourceFactory(null);
MediaSource mediaSource = new ExtractorMediaSource.Factory(rtmpDataSourceFactory)
mediaSource = new ExtractorMediaSource.Factory(rtmpDataSourceFactory)
.setExtractorsFactory(new DefaultExtractorsFactory())
.createMediaSource(contentUri);
return mediaSource;
}
break;
case C.TYPE_OTHER:
default:
MediaSource mediaSource = new ExtractorMediaSource.Factory(getDataSourceFactory(preview))
mediaSource = new ExtractorMediaSource.Factory(getDataSourceFactory(preview))
.setExtractorsFactory(new DefaultExtractorsFactory())
.createMediaSource(contentUri);
return mediaSource;
break;
}
if (isLooping()) {
return new LoopingMediaSource(mediaSource);
}
return mediaSource;
}
private DataSource.Factory getDataSourceFactory(boolean preview) {
......
......@@ -29,7 +29,7 @@ import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.audio.AudioRendererEventListener;
import com.google.android.exoplayer2.decoder.DecoderCounters;
import com.google.android.exoplayer2.drm.DefaultDrmSessionManager;
import com.google.android.exoplayer2.drm.DefaultDrmSessionEventListener;
import com.google.android.exoplayer2.metadata.Metadata;
import com.google.android.exoplayer2.metadata.MetadataOutput;
import com.google.android.exoplayer2.metadata.emsg.EventMessage;
......@@ -40,8 +40,6 @@ import com.google.android.exoplayer2.metadata.id3.Id3Frame;
import com.google.android.exoplayer2.metadata.id3.PrivFrame;
import com.google.android.exoplayer2.metadata.id3.TextInformationFrame;
import com.google.android.exoplayer2.metadata.id3.UrlLinkFrame;
import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener;
import com.google.android.exoplayer2.source.ExtractorMediaSource;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.MediaSourceEventListener;
import com.google.android.exoplayer2.source.TrackGroup;
......@@ -50,7 +48,6 @@ import com.google.android.exoplayer2.trackselection.MappingTrackSelector;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
import com.google.android.exoplayer2.upstream.DataSpec;
import com.google.android.exoplayer2.video.VideoRendererEventListener;
import java.io.IOException;
......@@ -59,8 +56,8 @@ import java.util.Locale;
public final class EventLogger implements Player.EventListener, MetadataOutput,
AudioRendererEventListener, VideoRendererEventListener, AdaptiveMediaSourceEventListener,
ExtractorMediaSource.EventListener, DefaultDrmSessionManager.EventListener {
AudioRendererEventListener, VideoRendererEventListener, MediaSourceEventListener,
DefaultDrmSessionEventListener {
private static final String TAG = "EventLogger";
private static final int MAX_TIMELINE_ITEM_LINES = 3;
......@@ -279,7 +276,7 @@ public final class EventLogger implements Player.EventListener, MetadataOutput,
Log.d(TAG, "renderedFirstFrame [" + surface + "]");
}
// DefaultDrmSessionManager.EventListener
// DefaultDrmSessionEventListener
@Override
public void onDrmSessionManagerError(Exception e) {
......@@ -301,15 +298,7 @@ public final class EventLogger implements Player.EventListener, MetadataOutput,
Log.d(TAG, "drmKeysLoaded [" + getSessionTimeString() + "]");
}
// ExtractorMediaSource.EventListener
@Override
public void onLoadError(IOException error) {
printInternalError("loadError", error);
}
// AdaptiveMediaSourceEventListener
//MediaSourceEventListener
@Override
public void onTimelineChanged(Timeline timeline, Object manifest, int reason) {
......
package tv.danmaku.ijk.media.exo2.demo.player;
import android.annotation.TargetApi;
import android.support.annotation.Nullable;
import com.google.android.exoplayer2.LoadControl;
import com.google.android.exoplayer2.RenderersFactory;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.analytics.AnalyticsCollector;
import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
import com.google.android.exoplayer2.trackselection.TrackSelector;
import com.google.android.exoplayer2.util.Clock;
@TargetApi(16)
public class SimpleExoPlayer2 extends SimpleExoPlayer {
protected SimpleExoPlayer2(RenderersFactory renderersFactory, TrackSelector trackSelector, LoadControl loadControl, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
super(renderersFactory, trackSelector, loadControl, drmSessionManager);
}
protected SimpleExoPlayer2(RenderersFactory renderersFactory, TrackSelector trackSelector, LoadControl loadControl, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, AnalyticsCollector.Factory analyticsCollectorFactory) {
super(renderersFactory, trackSelector, loadControl, drmSessionManager, analyticsCollectorFactory);
}
protected SimpleExoPlayer2(RenderersFactory renderersFactory, TrackSelector trackSelector, LoadControl loadControl, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, AnalyticsCollector.Factory analyticsCollectorFactory, Clock clock) {
super(renderersFactory, trackSelector, loadControl, drmSessionManager, analyticsCollectorFactory, clock);
}
public synchronized static SimpleExoPlayer2 createSimpleExoPlayer2(RenderersFactory renderersFactory, TrackSelector trackSelector, LoadControl loadControl, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
return new SimpleExoPlayer2(renderersFactory, trackSelector, loadControl, drmSessionManager);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册