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);