GSYVideoPlayer 完整使用指南:多内核 Android 视频播放器快速上手
【免费下载链接】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
GSYVideoPlayer 是一个把 IJKPlayer、ExoPlayer(Media3)、MediaPlayer、AliPlayer 四个内核收进同一套 UI 控件的 Android 视频播放器,边播边缓、外挂字幕、弹幕、GL 滤镜、投屏这些常见需求开箱即用,一套 API 就能覆盖从详情页到信息流的播放场景。🚀
能力全景
先把能力面铺出来,方便你 10 秒判断它能不能扛住你的场景。
| 能力 | 说明 |
|---|---|
| 多内核 | IJK / ExoPlayer2(Media3) / MediaPlayer / AliPlayer 一行代码切换 |
| 边播边缓 + 下载 | ProxyCacheManager 本地代理,边播边攒,可指定缓存目录 |
| 协议 | https、rtmp、rtsp、hls,FFmpeg n5.1.10 + OpenSSL 3.5.9 |
| 滤镜 | 黑白、复古、锐化等内置效果,支持 LUT 调色与自定义 Shader |
| 字幕 | SRT / WebVTT 外挂,三内核统一叠加,进度条可预览 |
| 窗口 | 全屏、悬浮小窗(含桌面)、折叠屏分屏/翻书/卧桌 |
| 列表 | 滑动自动播放、单例复用、详情无缝续播 |
| 投屏 | gsyvideoplayer-cast 模块提供 DLNA/UPnP,核心不引入 Jetty |
| 直播与广告 | 贴片/插播广告、静音、切码率 |
| 16k 适配 | arm64/x64 预编译 so 已适配 16K Page Size |
模块拆分是它好用的关键:渲染层、管理内核层、控制 UI 层、缓存层都可以单独继承替换,仓库里的 skills/ 目录按功能整理了 13 份速查手册,比如 skills/04-gsy-kernel-switch/SKILL.md,查 API 时比自己翻源码快很多。
5 分钟跑通第一次播放
从 0 到能播,最短路径就是引依赖、放控件、两行调用。
gradle 里引入依赖(整包已含 Java、Exo2 和三 ABI 的 so):
implementation 'io.github.carguo:gsyvideoplayer:14.0.0'布局里放一个标准控件:
<com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer android:layout_width="match_parent" android:layout_height="200dp" />代码里绑定地址并开播,第二参数就是"是否边播边缓":
player.setUp(url, false, "标题"); player.startPlayLogic();最容易忽略的是生命周期。暂停和销毁必须经过播放器:
player.getCurrentPlayer().onVideoPause(); // onPause player.getCurrentPlayer().release(); // onDestroy仓库示例在 app/src/main/java/com/example/gsyvideoplayer/PlayActivity.java,是最短的一屏播放 Demo。
高频功能实战
多内核切换
同一套控件换个解码内核:IJK 兼容性好但包体大,需要 DASH 和码率自适应就换 Exo,想彻底省掉 so 就换系统 MediaPlayer。
PlayerFactory.setPlayManager(Exo2PlayerManager.class);注意必须在 setUp 之前调用,且目标类要有 public 无参构造。
列表滑动自动播放
信息流场景最省内存的做法是全列表共享一个 player 实例。ListVideoUtil 把这个共享 player 动态"挂载"到滑入可视区的 item 容器上,滑出即释放,长列表也不会越播越卡。
ListVideoUtil.getInstance(this).addVideoPlayer(position, thumb, tag, container, playBtn);每个 item 记得给 player 设置 playTag,防止 RecyclerView 复用把 URL 绑错条目。
边播边缓
普通 http 视频想"边看边攒",setUp 的第二个参数传 true 即可,SDK 起一个本地 HTTP 代理,把视频流一边喂给 player 一边写到本地,命中缓存后二次打开零网络。
player.setUp(url, true, "标题");直播和 m3u8 建议保持 false,缓存只对完整点播有意义。
避坑与调优
几个高频问题,现象、原因和一行修复都给你列在这:
现象:切页面后 dex 泄漏、surface 相关崩溃。原因:onDestroy 没释放播放器。修复:
player.getCurrentPlayer().release()兜底调用一次。现象:全屏返回后暂停/播放指令"失灵",状态错乱。原因:全屏态是克隆出来的活跃实例,指令发到了原控件这个"影子"上。修复:所有操作统一走
player.getCurrentPlayer(),它永远指向当前活跃实例。现象:个别机型硬解黑屏、卡死。原因:设备 MediaCodec 对该格式支持不全。修复:
GSYVideoType.enableSmartMediaCodec()开启硬解失败自动软解回退,部分机型要在 Application.onCreate 就配好。现象:GL 滤镜调用后画面毫无变化。原因:滤镜只挂在 GL 渲染管线上,而默认渲染类型是 TEXTURE。修复:
GSYVideoType.setRenderType(GSYVideoType.GLSURFACE),再builder.setEffectFilter(new BlackAndWhiteEffect())。现象:包体莫名偏大、加载到错误的 so。原因:
gsyvideoplayer整包里已含 so,又重复引了ex_so或某个 ABI 模块。修复:同 ABI 只保留一套原生库。
更多配置项可以配合GSYVideoOptionBuilder一次设好,仓库里有一张常用配置参数图:
收束
GSYVideoPlayer 适合"不想为每种播放场景重写一套"的项目:内核可换、UI 可继承、缓存投屏弹幕现成。建议 clone 仓库把 demo 各跑一遍,重点对比一下各内核在同一素材下的表现,再决定默认选哪个内核 📌
【免费下载链接】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),仅供参考