news 2026/11/6 1:13:44

Android 多内核视频播放接入指南:GSYVideoPlayer 从依赖到列表连播实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android 多内核视频播放接入指南:GSYVideoPlayer 从依赖到列表连播实战

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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/6 1:12:35

【前端】常用属性及实例

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/6 1:12:22

机房能耗监测系统--资源可视

资源可视&#xff0c;显而易见就是建立基础资源档案的&#xff0c;平台最基础数据&#xff0c;绑定的就是设备上传过来的日志数据。局站基础档案建立&#xff0c;有很多种方式&#xff0c;平台现在做的档案建立模式&#xff0c;我认为是最清晰明了的一种方式。为了便于查看资源…

作者头像 李华
网站建设 2026/11/6 1:11:21

android 使用onVisibilityAggregated来判断view的显示与隐藏状态

最近有个列表上有个view, 要求实时知道它的显示与隐藏状态&#xff0c;花了很多时间效果都不好&#xff0c;总有一些场景不好使&#xff0c;现在发现了一个veiw自己的函数针对这个需求特别好使&#xff0c;这里记录下。public void onVisibilityAggregated(boolean isVisible)这…

作者头像 李华
网站建设 2026/11/6 1:10:39

服务链路追踪

服务链路追踪 为什么需要服务追踪 在微服务架构下&#xff0c;由于进行了服务拆分&#xff0c;一次请求往往需要涉及多个服务&#xff0c; 每个服务可能是由不同的团队开发&#xff0c;使用了不同的编程语言&#xff0c;还有可能部署在不同的机器上&#xff0c;分布在不同的数据…

作者头像 李华
网站建设 2026/11/6 1:08:47

FPGA功耗优化5大硬核技巧:从RTL到工具链的实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/6 1:08:44

EtherCAT与FSoE原理及实战:从STM32从站到24轴伺服

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华