Android 多内核视频播放接入指南:GSYVideoPlayer 从依赖到列表连播实战
【免费下载链接】GSYVideoPlayerVideo players (IJKplayer, ExoPlayer, MediaPlayer), HTTPS, 16k page size, danmaku (bullet chat) support, external subtitles, support for filters, watermarks, and GIF screenshots, pre-roll and mid-roll ads, multiple simultaneous playback, basic seeking/dragging, volume and brightness adjustment, play-while-cache support项目地址: https://gitcode.com/GitHub_Trending/gs/GSYVideoPlayer
你的 App 要同时播 HLS 和 MP4、要边播边缓存、要外挂字幕,还得在 IJK、ExoPlayer、MediaPlayer 三个内核里切换,又不想自己封装三套播放器?GSYVideoPlayer 把 IJKPlayer、Media3(ExoPlayer2)、MediaPlayer、AliPlayer 四种内核统一在一套 UI 和 API 之下,并内置边播边缓存、列表连播、SRT/WebVTT 字幕、弹幕和 GL 滤镜。本文面向第一次接入视频播放的 Android 开发者,读完你会完成加依赖、播出一条流、切换内核这三件事。
项目速览:一句话说清它是什么
GSYVideoPlayer 是一个开源 Android 视频播放器框架,在 IJKPlayer、Media3(ExoPlayer2)、MediaPlayer、AliPlayer 四种内核之上提供统一的播放管理 API 和 UI,切换播放引擎不用改业务代码。
- 多内核切换:
PlayerFactory一行代码在 IJK、ExoPlayer、MediaPlayer、AliPlayer 之间切换,格式兼容有兜底 - 边播边缓存:内置代理缓存,MP4 网络流可边播边下;Exo 模式换成 SimpleCache,支持 HLS
- 列表连播:单例播放管理,滑出屏幕自动释放,信息流式列表可直接跑通
- 跨内核字幕:SRT/WebVTT 外挂字幕在 UI 层统一渲染,IJK、Exo、MediaPlayer 三种内核通用
- GL 效果:多 pass 高斯、金字塔模糊、Bloom、LUT 调色、美颜等滤镜开箱即用
GSYVideoPlayer 采用分层架构,内核、缓存、渲染层均可插拔替换
快速上手:从 0 到跑通
加依赖三步播放第一个视频
第一步,添加 Maven Central 仓库与依赖。
repositories { mavenCentral() } // module 级 build.gradle,整包 = Java + Exo2 + IJK 原生库 implementation 'io.github.carguo:gsyvideoplayer:14.0.0'第二步,布局加控件,manifest 配置 Activity。
<com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer android:id="@+id/video_player" android:layout_width="match_parent" android:layout_height="200dp" /><activity android:name=".PlayActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode" android:screenOrientation="portrait" />configChanges是全屏的硬性前提,缺了它旋转屏幕会重建 Activity。
第三步,Activity 里调 setUp,并绑定生命周期。
videoPlayer = findViewById(R.id.video_player); videoPlayer.setUp(url, true, "测试视频"); videoPlayer.setCacheWithPlay(true); videoPlayer.startPlayLogic();// 分别在 onPause / onResume / onDestroy 中各调一行 videoPlayer.onVideoPause(); videoPlayer.onVideoResume(); GSYVideoManager.releaseAllVideos();跑通后你会看到:播放区出现封面和控制条,点按开始播放,进度条随视频推进,右上角全屏按钮可用。💡
核心能力:按使用场景讲
边播边缓存:弱网下长视频不卡顿
流是较长的 MP4,首遍播放不想干等缓冲,重播又想秒开:
videoPlayer.setCacheWithPlay(true);流是 HLS(m3u8)时代理缓存不支持,切到 Exo 的缓存:
PlayerFactory.setPlayManager(Exo2PlayerManager.class); CacheFactory.setCacheManager(new ExoPlayerCacheManager());收益:已缓存片段走本地,只有未缓存部分占用网络,重播同一视频几乎秒开。
列表里滑动即播:今日头条式信息流
信息流页面,item 滑入屏幕自动播,滑出去立即暂停释放。adapter 里用懒加载:
player.setUpLazy(url, true, null, null, "标题"); player.setPlayTag(TAG); player.setPlayPosition(position);Activity 的滚动监听里判断正在播放的 item 是否滑出可视区:
int position = GSYVideoManager.instance().getPlayPosition(); if (position < firstVisibleItem || position > lastVisibleItem) { GSYVideoManager.releaseAllVideos(); }收益:GSYVideoManager 全局管理单例播放,列表页有多个控件时,任何时刻只有一个在真正解码,内存占用小。
一键切换内核:换流不用改业务代码
某个流当前内核放不了时,不用改播放逻辑,全局换内核:
// IJK 内核(默认),FFmpeg n5.1.10,格式兼容最好 PlayerFactory.setPlayManager(IjkPlayerManager.class); // Exo 内核,格式支持最多,HLS/DASH 自适应清晰度 PlayerFactory.setPlayManager(Exo2PlayerManager.class); // 系统内核 MediaPlayer PlayerFactory.setPlayManager(SystemPlayerManager.class);收益:同一 URL 在不同设备上行为不一致时,可以先换内核兜底,业务层代码零改动。
进阶与避坑
用 GSYVideoOptionBuilder 统一配置播放器
列表 adapter 里参数多,用 Builder 一次打包,还能在多个控件间复用:
new GSYVideoOptionBuilder() .setUrl(url) .setThumbImageView(imageView) .setCacheWithPlay(true) .setVideoTitle("标题") .setShowFullAnimation(false) .setNeedLockFull(true) .build(videoPlayer);显示比例和渲染模式则是全局开关:
GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_16_9); GSYVideoType.setRenderType(GSYVideoType.GLSURFACE);给视频画面加 GL 滤镜
用滤镜前先把渲染模式切到 GLSurfaceView,再挂渲染器或效果:
GSYVideoType.setRenderType(GSYVideoType.GLSURFACE); GSYVideoGLViewMultiPassRender render = new GSYVideoGLViewMultiPassRender(); render.setMultiPassEffect(new GaussianBlurMultiPassEffect(6.0f)); player.setCustomGLRenderer(render);Demo 里的背景模糊填充播放:背景取自当前画面模糊后的版本
LUT 调色、美颜、Bloom 等更多效果见 doc/RECENT_FEATURES.md。
高频坑三行排查法
混淆后 ClassNotFoundException现象:debug 正常,开 R8 后 release 包崩溃在 ClassNotFound 原因:PlayerFactory、CacheFactory、全屏控件都靠反射构造实例,R8 重命名了构造方法 解法:按 doc/QUESTION.md 只保留三处反射点的 keep 规则,不要整包保留
so 加载错误现象:日志报找不到 libijkplayer.so 或 dlopen 失败 原因:v14 默认只提供 arm64-v8a / armeabi-v7a / x86_64 三个 ABI,设备不在其中,或同时引入了 ex_so 与独立 ABI 模块 解法:abiFilters与所引模块对齐;分模块引入时二者只选其一
全屏旋转后播放器重置现象:点全屏后页面重建,播放进度和状态丢失 原因:manifest 没配configChanges,旋转触发了 Activity 重建 解法:给播放页补上第二步里的configChanges
HLS 缓存不生效现象:m3u8 加了缓存,每次仍重新下载文件 原因:默认 ProxyCacheManager 是代理缓存,只支持渐进式流 解法:换 ExoPlayerCacheManager,该模式仅配合 Exo 内核使用
写在最后
GSYVideoPlayer 适合“格式杂、要多内核、功能多”的视频业务:列表连播、缓存、字幕、滤镜、全屏/小窗开箱即用,遇到放不了的流可以换内核兜底。反过来,如果你只播本地几个 MP4,直接用 ExoPlayer 或 MediaPlayer 更轻量,它的 Java 层加 IJK 原生库的依赖体积不小。
下一步建议:完整 API 与直接播放、列表、详情页三种最小用法在 doc/USE.md,遇到问题先翻一遍问题集锦 doc/QUESTION.md,大多数坑都有现成答案。
【免费下载链接】GSYVideoPlayerVideo players (IJKplayer, ExoPlayer, MediaPlayer), HTTPS, 16k page size, danmaku (bullet chat) support, external subtitles, support for filters, watermarks, and GIF screenshots, pre-roll and mid-roll ads, multiple simultaneous playback, basic seeking/dragging, volume and brightness adjustment, play-while-cache support项目地址: https://gitcode.com/GitHub_Trending/gs/GSYVideoPlayer
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考