doc/UPDATE_VERSION.md
Click to see the English version
setDatabaseProvider 方法 ExoSourceManager.setExoMediaSourceInterceptListener(new ExoMediaSourceInterceptListener() {
@Override
public MediaSource getMediaSource(String dataSource, boolean preview, boolean cacheEnable, boolean isLooping, File cacheDir) {
//如果返回 null,就使用默认的
return null;
}
/**
* 通过自定义的 HttpDataSource ,可以设置自签证书或者忽略证书
* demo 里的 GSYExoHttpDataSourceFactory 使用的是忽略证书
* */
@Override
public DataSource.Factory getHttpDataSourceFactory(String userAgent, @Nullable TransferListener listener, int connectTimeoutMillis, int readTimeoutMillis,
Map<String, String> mapHeadData, boolean allowCrossProtocolRedirects) {
//如果返回 null,就使用默认的
GSYExoHttpDataSourceFactory factory = new GSYExoHttpDataSourceFactory(userAgent, listener,
connectTimeoutMillis,
readTimeoutMillis, allowCrossProtocolRedirects);
factory.setDefaultRequestProperties(mapHeadData);
return factory;
}
});
ExoSourceManager.setExoMediaSourceInterceptListener(new ExoMediaSourceInterceptListener() {
@Override
public MediaSource getMediaSource(String dataSource, boolean preview, boolean cacheEnable, boolean isLooping, File cacheDir) {
//如果返回 null,就使用默认的
return null;
}
/**
* 通过自定义的 HttpDataSource ,可以设置自签证书或者忽略证书
* demo 里的 GSYExoHttpDataSourceFactory 使用的是忽略证书
* */
@Override
public HttpDataSource.BaseFactory getHttpDataSourceFactory(String userAgent, @Nullable TransferListener listener, int connectTimeoutMillis, int readTimeoutMillis, boolean allowCrossProtocolRedirects) {
//如果返回 null,就使用默认的
return new GSYExoHttpDataSourceFactory(userAgent, listener,
connectTimeoutMillis,
readTimeoutMillis, allowCrossProtocolRedirects);
}
});
ExoSourceManager
public static void setHttpReadTimeout(int httpReadTimeout)
public static void setHttpConnectTimeout(int httpConnectTimeout)
String url = RawResourceDataSource.buildRawResourceUri(R.raw.test).toString();
GSYVideoType.setScreenScaleRatio
/**
* 是否需要适配在竖屏横屏时,由于刘海屏或者打孔屏占据空间,导致标题显示被遮盖的问题
*
* @param needAutoAdaptation 默认false
*/
public void setNeedAutoAdaptation(boolean needAutoAdaptation)
GSYVideoManager
.instance()
.setPlayerInitSuccessListener(new IPlayerInitSuccessListener() {
///播放器初始化成果回调,可用于播放前的自定义设置
@Override
public void onPlayerInitSuccess(IMediaPlayer player, GSYModel model) {
if (player instanceof IjkExo2MediaPlayer) {
((IjkExo2MediaPlayer) player).setTrackSelector(new DefaultTrackSelector());
((IjkExo2MediaPlayer) player).setLoadControl(new DefaultLoadControl());
}
}
});
Map<String, String> header = new HashMap<>();
header.put("allowCrossProtocolRedirects", "true");
xxx.setMapHeadData(header)
//设置 seek 的临近帧。
if(detailPlayer.getGSYVideoManager().getPlayer() instanceof Exo2PlayerManager) {
((Exo2PlayerManager) detailPlayer.getGSYVideoManager().getPlayer()).setSeekParameter(SeekParameters.NEXT_SYNC);
Debuger.printfError("***** setSeekParameter **** ");
}
ExoSourceManager.setSkipSSLChain(true);
orientationUtils.setIsPause(true);
overrideExtension to exoPlayerPlayerFactory.setPlayManager(Exo2PlayerManager.class);//EXO模式
PlayerFactory.setPlayManager(SystemPlayerManager.class);//系统模式
PlayerFactory.setPlayManager(IjkPlayerManager.class);//ijk模式
CacheFactory.setCacheManager(ExoPlayerCacheManager.class);//exo缓存模式,支持m3u8,只支持exo
CacheFactory.setCacheManager(ProxyCacheManager.class);//代理缓存模式,支持所有模式,不支持m3u8等
//PlayerFactory.setPlayManager(new Exo2PlayerManager());//EXO模式
//PlayerFactory.setPlayManager(new SystemPlayerManager());//系统模式
//PlayerFactory.setPlayManager(new IjkPlayerManager());//ijk模式
//CacheFactory.setCacheManager(new ExoPlayerCacheManager());//exo缓存模式,支持m3u8,只支持exo
//CacheFactory.setCacheManager(new ProxyCacheManager());//代理缓存模式,支持所有模式,不支持m3u8等
ExoSourceManager.setExoMediaSourceInterceptListener(new ExoMediaSourceInterceptListener() {
/**
* @param dataSource 链接
* @param preview 是否带上header,默认有header自动设置为true
* @param cacheEnable 是否需要缓存
* @param isLooping 是否循环
* @param cacheDir 自定义缓存目录
* @return 返回不为空时,使用返回的自定义mediaSource
*/
@Override
public MediaSource getMediaSource(String dataSource, boolean preview, boolean cacheEnable, boolean isLooping, File cacheDir) {
return null;
}
});
logLevel、ijkLibLoader直接通过IJKPlayerManager静态方法设置/**
* 是否根据视频尺寸,自动选择竖屏全屏或者横屏全屏,注意,这时候默认旋转无效
* @param autoFullWithSize 默认false
*/
public void setAutoFullWithSize(boolean autoFullWithSize)
String url = "android.resource://" + getPackageName() + "/" + R.raw.test;
GSYVideoManager.instance().enableRawPlay(getApplicationContext());
/*
* 当前是否全屏状态
*
* @return 当前是否全屏状态, true代表是。
*/
public static boolean isFullState(Activity activity)
XXXXManager相关
/**
* 恢复暂停状态
*
* @param seek 是否产生seek动作,直播设置为false
*/
public static void onResume(String key, boolean seek)
Video相关
/**
* 恢复暂停状态
*
* @param seek 是否产生seek动作
*/
@Override
public void onVideoResume(boolean seek)
GSYSampleADVideoPlayer 与 DetailADPlayerplayNext()接口。getGSYVideoManager()方法实现自己的Manager。CustomRenderVideoPlayer演示如何设置自定义渲染层。ListMultiVideoActivity和MultiSampleVideo演示如何同时播放多个视频。DetailADPlayer2和ListADVideoActivity演示广告与中间插入广告支持。/**
* 长时间失去音频焦点,暂停播放器
*
* @param releaseWhenLossAudio 默认true,false的时候只会暂停
*/
public void setReleaseWhenLossAudio(boolean releaseWhenLossAudio)
1、增肌PlayerManager,更新为ExoPlayer2,优化对ExoPlayer2的支持。
2、增加系统播放器AndroidMediaPlayer支持
3、增对列表增加setUpLazy方法,优化列表中可能的滑动卡顿
/**
* 在点击播放的时候才进行真正setup
*/
public boolean setUpLazy(String url, boolean cacheWithPlay, File cachePath, Map<String, String> mapHeadData, String title)
4、优化GL渲染和处理切换渲染效果崩溃。
5、DEMO增加SamllVideoHelper实现小窗口逻辑,更新demo
6、优化触摸的音量、亮度、进度的弹出框,优化可自定义程度
/**
* 触摸进度dialog的layoutId
* 继承后重写可返回自定义
* 有自定义的实现逻辑可重载showProgressDialog方法
*/
protected int getProgressDialogLayoutId()
/**
* 触摸进度dialog的进度条id
* 继承后重写可返回自定义,如果没有可返回空
* 有自定义的实现逻辑可重载showProgressDialog方法
*/
protected int getProgressDialogProgressId()
/**
* 触摸进度dialog的当前时间文本
* 继承后重写可返回自定义,如果没有可返回空
* 有自定义的实现逻辑可重载showProgressDialog方法
*/
protected int getProgressDialogCurrentDurationTextId()
/**
* 触摸进度dialog全部时间文本
* 继承后重写可返回自定义,如果没有可返回空
* 有自定义的实现逻辑可重载showProgressDialog方法
*/
protected int getProgressDialogAllDurationTextId()
/**
* 触摸进度dialog的图片id
* 继承后重写可返回自定义,如果没有可返回空
* 有自定义的实现逻辑可重载showProgressDialog方法
*/
protected int getProgressDialogImageId()
/**
* 音量dialog的layoutId
* 继承后重写可返回自定义
* 有自定义的实现逻辑可重载showVolumeDialog方法
*/
protected int getVolumeLayoutId()
/**
* 音量dialog的百分比进度条 id
* 继承后重写可返回自定义,如果没有可返回空
* 有自定义的实现逻辑可重载showVolumeDialog方法
*/
protected int getVolumeProgressId()
/**
* 亮度dialog的layoutId
* 继承后重写可返回自定义
* 有自定义的实现逻辑可重载showBrightnessDialog方法
*/
protected int getBrightnessLayoutId()
/**
* 亮度dialog的百分比text id
* 继承后重写可返回自定义,如果没有可返回空
* 有自定义的实现逻辑可重载showBrightnessDialog方法
*/
protected int getBrightnessTextId()
/**
* 进度回调
*/
public void setGSYVideoProgressListener(GSYVideoProgressListener videoProgressListener)
DetailFilterActivity中注释的
//高斯拉伸视频铺满背景,替换黑色,前台正常比例播放
GSYVideoManager.instance().setLogLevel(IjkMediaPlayer.IJK_LOG_SILENT);
1、全局设置
GSYVideoType.setRenderType(GSYVideoType.GLSURFACE);
2、设置滤镜
player.setEffectFilter(new BarrelBlurEffect());
public void setSpeedPlaying(float speed, boolean soundTouch)
/**
* 获取全屏播放器对象
*
* @return GSYVideoPlayer 如果没有则返回空。
*/
public GSYVideoPlayer getFullWindowPlayer()
/**
* 是否跟随系统旋转,false的话,系统禁止旋转也会跟着旋转
* @param rotateWithSystem 默认true
*/
public void setRotateWithSystem(boolean rotateWithSystem)
StandardGSYVideoPlayer.java
/**
* 设置触摸显示控制ui的消失时间
* @param dismissControlTime 毫秒,默认2500
*/
public void setDismissControlTime(int dismissControlTime)
/**
* 调整触摸滑动快进的比例
* @param seekRatio 滑动快进的比例,默认1。数值越大,滑动的产生的seek越小
*/
public void setSeekRatio(float seekRatio)
GSYVideoType.java
//全屏拉伸显示,使用这个属性时,surface_container建议使用FrameLayout
public final static int SCREEN_MATCH_FULL = -4;
/**
* 是否需要加载显示暂停的cover图片
* 打开状态下,暂停退到后台,再回到前台不会显示黑屏,但可以对某些机型有概率出现OOM
* 关闭情况下,暂停退到后台,再回到前台显示黑屏
*
* @param showPauseCover 默认true
*/
public void setShowPauseCover(boolean showPauseCover)
/**
* 设置自定义so包加载类
* 需要在instance之前设置
*/
public static void setIjkLibLoader(IjkLibLoader libLoader)
/**
* 是否可以全屏滑动界面改变进度,声音等
* 默认 true
*/
public void setIsTouchWigetFull(boolean isTouchWigetFull)
/**
* 是否需要在buffer缓冲时,增加外部超时判断,目前对于刚开始超时还没效果
*
* 超时后会走onError接口,播放器通过onPlayError回调出
*
* 错误码为 : BUFFER_TIME_OUT_ERROR = -192
*
* 由于onError之后执行GSYVideoPlayer的OnError,如果不想触发错误,
* 可以重载onError,在super之前拦截处理。
*
* public void onError(int what, int extra){
* do you want before super and return;
* super.onError(what, extra)
* }
*
* @param timeOut 超时时间,毫秒 默认8000
* @param needTimeOutOther 是否需要延时设置,默认关闭
*/
public void setTimeOut(int timeOut, boolean needTimeOutOther) {
this.timeOut = timeOut;
this.needTimeOutOther = needTimeOutOther;
}
/**
* 设置右下角 显示切换到全屏 的按键资源
* 必须在setUp之前设置
* 不设置使用默认
*/
public void setEnlargeImageRes(int mEnlargeImageRes)
/**
* 设置右下角 显示退出全屏 的按键资源
* 必须在setUp之前设置
* 不设置使用默认
*/
public void setShrinkImageRes(int mShrinkImageRes)
/**
* 设置IJK视频的option
*/
public void setOptionModelList(List<VideoOptionModel> optionModelList)
GSYVideoManager下 可参考:ListNormalAdapter
/**
* 是否需要静音
*/
public void setNeedMute(boolean needMute)
/**
* 如果需要使用到:全屏和普通播放下使用两套布局的支持。
* 那么重载播放器请记得重载下方构造方法
*/
public XXXXXXXXXX(Context context, Boolean fullFlag) {
super(context, fullFlag);
}
····
//这个必须配置最上面的构造才能生效
@Override
public int getLayoutId() {
if (mIfCurrentIsFullscreen) {
return R.layout.sample_video_land;
}
return R.layout.sample_video;
}
/**
* 是否需要显示流量提示,默认true
*/
public void setNeedShowWifiTip(boolean needShowWifiTip)
/**
* 如果是需要进度条预览的设置打开,默认关闭
*/
public void setOpenPreView(boolean localFile)
GSYVideoManager
/**
* 设置了视频的播放类型
* GSYVideoType IJKPLAYER = 0 or IJKEXOPLAYER = 1;
*/
public void setVideoType(Context context, int videoType)
GSYVideoType
/**
* 设置显示比例
*/
public static void setShowType(int type)
/**
* 使能硬解码,播放前设置
*/
public static void enableMediaCodec() {
MEDIA_CODEC_FLAG = true;
}
/**
* 关闭硬解码,播放前设置
*/
public static void disableMediaCodec()
StandardGSYVideoPlayer/ListVideoUtil
/**
* 是否需要全屏锁定屏幕功能
* 如果单独使用请设置setIfCurrentIsFullscreen为true
*/
public void setNeedLockFull(boolean needLoadFull)
GSYVideoManager
/**
* 暂停播放
*/
public static void onPause()
/**
* 恢复播放
*/
public static void onResume()
/**
* 全屏隐藏虚拟按键,默认打开
*/
public void setHideKey(boolean hideKey)
GSYVideoManager
/**
* 删除默认所有缓存文件
*/
public static void clearAllDefaultCache(Context context)
/**
* 删除url对应默认缓存文件
*/
public static void clearDefaultCache(Context context, String url)
GSYVideoPlayer
/**
* 清除当前缓存
*/
public void clearCurrentCache()
/**
* 从哪里开始播放
* 目前有时候前几秒有跳动问题
*/
public void setSeekOnStart(int seekOnStart)
正常模式
//默认缓存路径方式
holder.gsyVideoPlayer.setUp(url, true , "");
···
//一个列表的视频缓存路径相同
holder.gsyVideoPlayer.setUp(url, true, new File(FileUtils.getTestPath(), ""));
···
//如果一个列表里的缓存路径不同,需要用下方的方式
//避免全屏返回的时候不可用了,只初始化不是当前位置的ui
if (playPosition < 0 || playPosition != position ||
!GSYVideoManager.instance().getPlayTag().equals(ListNormalAdapter.TAG)) {
holder.gsyVideoPlayer.initUIState();
}
//如果设置了点击封面可以播放,如果缓存列表路径不一致,还需要设置封面点击
holder.gsyVideoPlayer.setThumbPlay(true);
holder.gsyVideoPlayer.getStartButton().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//需要切换缓存路径的
holder.gsyVideoPlayer.setUp(url, true, new File(FileUtils.getTestPath(), ""));
holder.gsyVideoPlayer.startPlayLogic();
}
});
holder.gsyVideoPlayer.getThumbImageViewLayout().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//需要切换缓存路径的
holder.gsyVideoPlayer.setUp(url, true, new File(FileUtils.getTestPath(), ""));
holder.gsyVideoPlayer.startPlayLogic();
}
});
ListVideoUtils
public void setCachePath(File cachePath)
public void setObjects(Object[] objects)
public void setMapHeadData(Map<String, String> mapHeadData)
/**
* 网络速度
* 注意,这里如果是开启了缓存,因为读取本地代理,缓存成功后还是存在速度的
* 再打开已经缓存的本地文件,网络速度才会回0.因为是播放本地文件了
*/
public long getNetSpeed()
/**
* 网络速度
* 注意,这里如果是开启了缓存,因为读取本地代理,缓存成功后还是存在速度的
* 再打开已经缓存的本地文件,网络速度才会回0.因为是播放本地文件了
*/
public String getNetSpeedText()
/**
* 播放速度
*/
public void setSpeed(float speed)
public void setLooping(boolean looping)
/**
* 全屏动画
*
* @param showFullAnimation 是否使用全屏动画效果
*/
public void setShowFullAnimation(boolean showFullAnimation)
/**
* 是否开启自动旋转
*/
public void setRotateViewAuto(boolean rotateViewAuto)
/**
* 一全屏就锁屏横屏,默认false竖屏,可配合setRotateViewAuto使用
*/
public void setLockLand(boolean lockLand)
/**
* 是否自动旋转
*
* @param autoRotation 是否要支持重力旋转
*/
public void setAutoRotation(boolean autoRotation) {
this.autoRotation = autoRotation;
}
/**
* 是否全屏就马上横屏
*
* @param fullLandFrist 如果是,那么全屏的时候就会切换到横屏
*/
public void setFullLandFrist(boolean fullLandFrist) {
this.fullLandFrist = fullLandFrist;
}
/**
* 全屏动画
*
* @param showFullAnimation 是否使用全屏动画效果
*/
public void setShowFullAnimation(boolean showFullAnimation) {
this.showFullAnimation = showFullAnimation;
}
*增加了X86类型的依赖,个人可根据爱好在APP的build里面添加自己要的支持类型。
arm64和-86_64的没有加入,如果需要自己添加即可,因为编译最低需要API21
android {
···
defaultConfig {
···
ndk {
//设置支持的SO库架构
abiFilters 'armeabi', 'armeabi-v7a', 'x86'
}
}
*开放了取时长和总时长的接口。 *增加了VideoAllCallBack的准备视频完成的回调onPrepared。
listVideoUtil.getDuration()
listVideoUtil.getCurrentPositionWhenPlaying();
GSYVideoPlayer.getDuration()
GSYVideoPlayer.getCurrentPositionWhenPlaying();
//小窗口关闭被点击的时候回调处理回复页面
listVideoUtil.setVideoAllCallBack(new SampleListener(){
@Override
public void onQuitSmallWidget(String url, Object... objects) {
super.onQuitSmallWidget(url, objects);
//大于0说明有播放,//对应的播放列表TAG
if (listVideoUtil.getPlayPosition() >= 0 && listVideoUtil.getPlayTAG().equals(ListVideoAdapter.TAG)) {
//当前播放的位置
int position = listVideoUtil.getPlayPosition();
//不可视的是时候
if ((position < firstVisibleItem || position > lastVisibleItem)) {
//释放掉视频
listVideoUtil.releaseVideoPlayer();
listVideoAdapter.notifyDataSetChanged();
}
}
}
});
更容易导入,减少了无用的依赖情况,去除了import的时候需要配置gradle.properties的问题。
有全屏到非全屏,有小窗口到非小窗口,结束播放错误触摸等等的接口回调,增加了Debuger,可以使能或者关闭调试输出。
/**
* 底部进度条-弹出的
*/
public void setBottomShowProgressBarDrawable(Drawable drawable, Drawable thumb)
/**
* 底部进度条-非弹出
*/
public void setBottomProgressBarDrawable(Drawable drawable)
/**
* 声音进度条
*/
public void setDialogVolumeProgressBar(Drawable drawable)
/**
* 中间进度条
*/
public void setDialogProgressBar(Drawable drawable)
/**
* 中间进度条字体颜色
*/
public void setDialogProgressColor(int highLightColor, int normalColor)
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int lastVisibleItem = firstVisibleItem + visibleItemCount;
//大于0说明有播放,//对应的播放列表TAG
if (listVideoUtil.getPlayPosition() >= 0 && listVideoUtil.getPlayTAG().equals(ListVideoAdapter.TAG)) {
//当前播放的位置
int position = listVideoUtil.getPlayPosition();
//不可视的是时候
if ((position < firstVisibleItem || position > lastVisibleItem)) {
//如果是小窗口就不需要处理
if (!listVideoUtil.isSmall()) {
//小窗口
int size = CommonUtil.dip2px(ListVideo2Activity.this, 150);
listVideoUtil.showSmallVideo(new Point(size, size), false, true);
}
} else {
if (listVideoUtil.isSmall()) {
listVideoUtil.smallVideoToNormal();
}
}
}
}
/**
* 全屏动画
*
* @param showFullAnimation 是否使用全屏动画效果
*/
public void setShowFullAnimation(boolean showFullAnimation)
/**
* 是否可以滑动界面改变进度,声音等
*/
public void setIsTouchWiget(boolean isTouchWiget)
videoList.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int lastVisibleItem = firstVisibleItem + visibleItemCount;
//大于0说明有播放
if (GSYVideoManager.instance().getPlayPosition() >= 0) {
//当前播放的位置
int position = GSYVideoManager.instance().getPlayPosition();
//对应的播放列表TAG
if (GSYVideoManager.instance().getPlayTag().equals(ListNormalAdapter.TAG)
&& (position < firstVisibleItem || position > lastVisibleItem)) {
//如果滑出去了上面和下面就是否,和今日头条一样
GSYVideoPlayer.releaseAllVideos();
listNormalAdapter.notifyDataSetChanged();
}
}
}
});
····
holder.gsyVideoPlayer.setPlayTag(TAG);
holder.gsyVideoPlayer.setPlayPosition(position);