GSYVideoPlayer开源项目
项目是基于ijkplayer编译的so,ijkplayer基于FFmpeg
一、 依赖方法
7.0版本使用了anndroidx,support版本请看6.x.x
JCenter 引入方法(推荐)
//完整版引入
implementation 'com.shuyu:GSYVideoPlayer:7.1.1'
二、 项目说明
项目经过多版本调整之后,目前大致结构分为如下 :
- Player 播放内核层:IjkMediaPlayer、ExoPlayr2、MediaPlayer(IPlayerManager)。
- Cache 缓存层:ProxyCacheManager、ExoPlayerCacheManager(ICacheManager)。
- Manager 内核管理层:GSYVideoManager(GSYVideoBaseManager <- GSYVideoViewBridge)。
- Video 播放器控件层:GSYTextureRenderVIew 到 GSYVideoPlayer 五层。
- Render 渲染控件层:TextureView、SurfaceView、GLSurfaceView(GSYRenderView <- IGSYRenderView)。
目前整个video层即是传统controller层,也是大部分时候自定义实现需要继承的层
结构如下图:
从这里看出,项目的播放内核、管理器、渲染层都是可以自定义替换的。
三、 使用模式
1.直接播放
2.详情页播放
(1)模式一(全屏是竖直的)
(2)模式二(全屏是横向的)
3.列表中使用
(1)模式一(全屏是竖直的)
(2)模式二(全屏是横向的)
四、更多使用
1.切换内核
//PlayerFactory.setPlayManager(new Exo2PlayerManager());//EXO模式
//PlayerFactory.setPlayManager(new SystemPlayerManager());//系统模式
//PlayerFactory.setPlayManager(new IjkPlayerManager());//ijk模式
2.调整代码结构,CacheFactory 更方便自定义,默认 ProxyCacheManager。
//CacheFactory.setCacheManager(new ExoPlayerCacheManager());//exo缓存模式,支持m3u8,只支持exo
//CacheFactory.setCacheManager(new ProxyCacheManager());//代理缓存模式,支持所有模式,不支持m3u8等
3.增加 ExoMediaSourceInterceptListener,方便 Exo 模式下使用自定义的 MediaSource。
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;
}
});
4.切换比例
//默认显示比例
GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_DEFAULT);
//16:9
GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_16_9);
//全屏裁减显示,为了显示正常 CoverImageView 建议使用FrameLayout作为父布局
GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_FULL);
//全屏拉伸显示,使用这个属性时,surface_container建议使用FrameLayout
GSYVideoType.setShowType(GSYVideoType.SCREEN_MATCH_FULL);
//4:3
GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_4_3);
5.切换渲染
//默认TextureView
GSYVideoType.setRenderType(GSYVideoType.TEXTURE);
//SurfaceView,动画切换等时候效果比较差
GSYVideoType.setRenderType(GSYVideoType.SUFRACE);
//GLSurfaceView、支持滤镜
GSYVideoType.setRenderType(GSYVideoType.GLSURFACE);