news 2026/11/6 3:34:01

GSYVideoPlayer 使用指南:一个 Android 视频播放器接入 IJK、ExoPlayer 与系统内核

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GSYVideoPlayer 使用指南:一个 Android 视频播放器接入 IJK、ExoPlayer 与系统内核

GSYVideoPlayer 使用指南:一个 Android 视频播放器接入 IJK、ExoPlayer 与系统内核

【免费下载链接】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 是一个 Android 视频播放器框架,最核心的一点:同一套 UI 控件和 API,底下可以挂 IJKplayer、Media3(ExoPlayer)、MediaPlayer 甚至 AliPlayer 四个内核,切换只换注册方式,你的播放页、列表页、全屏逻辑一行不用改。依赖声明一下,控件扔进布局,setUp传个地址,画面就出来了。

项目定位

维度说明
解决什么问题不用自己在 FFmpeg 构建、多内核适配、渲染层和全屏切换上花时间
给谁用需要接视频播放但不想自维护 so 和渲染层的 App 团队
和同类方案的差异控件、内核、管理三层解耦,UI 换内核不改代码,反之亦然
  • 内核层:IJKplayer、Media3(ExoPlayer)、MediaPlayer、AliPlayer,全局切换
  • 缓存层:基于 AndroidVideoCache 的边播边缓存,Media3 走 SimpleCache
  • 能力面:弹幕、外挂字幕(SRT / WebVTT)、滤镜、水印、GIF 截图、贴片广告
  • 当前版本 v14:FFmpeg n5.1.10 + OpenSSL 3.5.9,arm64/armv7a/x64 适配 16K page size
  • 协议覆盖:http(s)、hls、rtmp、rtsp、concat、mpeg 等

快速上手

声明 Maven 依赖

整包最省事,v14 的gsyvideoplayer聚合包已经带上 Java 层、Exo2 适配和三 ABI 的 IJK so:

implementation 'io.github.carguo:gsyvideoplayer:14.0.0'

想按 ABI 裁剪包体就分模块引:gsyvideoplayer-java当主库,再按需要加gsyvideoplayer-exo2,so 选ex_so或单个 ABI 的模块。⚠️ 同一个 ABI 不要两套 native 库同时引,这是后面高频踩的坑。

布局里放一个播放控件

StandardGSYVideoPlayer是默认布局最完整的控件:

<com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer android:id="@+id/video_player" android:layout_width="match_parent" android:layout_height="200dp" />

各模块的依赖关系看这张图就能对上:

接好生命周期再 startPlayLogic

播放只有三行代码:

player.setUp("https://example.com/video.mp4", true, "标题"); player.startPlayLogic();

真正要记住的是生命周期。全屏状态下你手里的控件引用不是真正在播的那个实例,所有状态操作都走getCurrentPlayer():

// onPause player.getCurrentPlayer().onVideoPause(); // onResume(直播场景传 false,不从原进度恢复) player.getCurrentPlayer().onVideoResume(false); // onDestroy player.getCurrentPlayer().release(); GSYVideoManager.releaseAllVideos();

功能亮点

边播边缓存

普通 http 视频在setUp时把cacheWithPlay传true,播放同时写入本地缓存目录,第二次打开秒开。适用场景:课程视频、剧集这类反复回看的点播内容。m3u8 和直播流反过来,必须传false。

一行代码换内核

内核注册走GSYVideoManager.setPlayManager(...),四个内核实现同一套IPlayerManager接口,播放、暂停、状态回调的 API 对上层完全一致。格式吃不准、弱网卡顿,先换 Exo 或系统内核试试,业务代码不动。

跨内核的统一字幕层

外挂字幕不区分内核:SRT 和 WebVTT 在 IJK、Media3、MediaPlayer 上走同一套 UI 渲染,Media3 的内嵌 cues 也能桥接到这个图层。做国际化内容播放,不用为每个内核各写一遍字幕逻辑。

滤镜、水印与 GIF 截图

GL 渲染管线上叠加滤镜:美颜、LUT 调色、高斯/金字塔模糊、复古 CRT、故障风都在 近期特性清单 里。截图分两种:纯视频帧和带 UI 的整播放器画面,都能转 GIF。短内容和工具类 App 拿来做"分享当前画面"这类功能,不用自己写 GL 管线。

可选模块按需加

DLNA 投屏是独立的gsyvideoplayer-cast模块,核心包不背 Jetty 的重量;Jetpack Compose 项目有专门的 wrapper 模块。demo 应用里 50 多个 Activity 覆盖列表、ViewPager2、悬浮窗、折叠屏等场景,拿不准的用法直接翻 demo 对照。

实战走读:从列表进详情页播放

跟着 Demo 的 PlayActivity 走一遍完整链路:列表页点一条视频进详情页,带多清晰度切换和全屏旋转。

入口在onCreate,拿绑定、注册返回拦截、初始化播放器:

binding = ActivityPlayBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot());

多清晰度播放:把每个源包成SwitchVideoModel组成列表,setUp传 list 而不是单个 url,UI 上直接出现清晰度菜单:

List<SwitchVideoModel> list = new ArrayList<>(); list.add(new SwitchVideoModel("普通", url1)); list.add(new SwitchVideoModel("清晰", url2)); binding.videoPlayer.setUp(list, false, "测试视频");

注意这里cacheWithPlay传了false——demo 源是 HLS,属于必须关缓存的场景。接着加封面图、显示标题栏、挂OrientationUtils处理全屏横竖屏切换,然后startPlayLogic()。

返回键逻辑值得抄:先判断当前是否全屏,是的话把点击交给全屏按钮(退出全屏),否则才释放并 finish:

if (orientationUtils.getScreenType() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) { binding.videoPlayer.getFullscreenButton().performClick(); return; } binding.videoPlayer.setVideoAllCallBack(null); GSYVideoManager.releaseAllVideos(); finish();

整条链路结束:暂停、恢复、退出全屏、释放,四件事都有明确归属,getCurrentPlayer()+release()是收尾的关键。

高频坑与直接修法

m3u8 / 直播流卡死或加载异常。缓存模块不支持 HLS。修法:这类源cacheWithPlay一律false,别为了秒开硬开。

同一个 ABI 引了两套 IJK so。比如ex_so和gsyvideoplayer-arm64同时上。结果不是崩就是加载到错的 so。修法:按 ABI 二选一,依赖文档 有完整组合表。

全屏后暂停、释放不生效,或状态错乱。你操作的是外层控件,真正在播的是全屏克隆体。修法:所有状态操作统一player.getCurrentPlayer().xxx(),释放时再加GSYVideoManager.releaseAllVideos()兜底。

旋转后视频重头播或黑屏。屏幕旋转触发了 Activity 重建。修法:播放页在 Manifest 里配configChanges覆盖 orientation 和 screenSize,screenOrientation设为 portrait,把旋转交给OrientationUtils控制。

16K page size 新设备加载 so 失败。修法:用 v14 的 arm64/armv7a/x64 模块或ex_so,已适配;armv5 和老 x86 模块没升级 FFmpeg 5,只给存量旧架构项目用。

写在最后

GSYVideoPlayer 适合要接视频播放、又不想自己维护 IJK so 构建和渲染层适配的 Android 团队:一个控件换四个内核,UI、缓存、字幕、全屏这些活它都干完了。建议先跑通 demo 的PlayActivity,把生命周期和全屏状态这两处接对,再进生产。

【免费下载链接】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 3:33:34

高可用-Keepalived、综合实践:web 集群

高可用-Keepalived HA 集群能解决哪些问题&#xff1f; 当计划使用HA集群时候&#xff0c;有一个重要的问题需要回答&#xff1a;服务放到HA集群中&#xff0c;可用性是否会增加&#xff1f; 回答这个问题&#xff0c;需要弄清楚服务的能力和该服务的客户端如何配置。取决于解决…

作者头像 李华
网站建设 2026/11/6 3:31:16

BiliSum 桌面端使用指南:从安装到第一个视频摘要的完整流程

【免费下载链接】BiliSum 为 Bilibili、YouTube 及本地视频提供 AI 视频摘要和知识库.AI video summarizer and knowledge base for Bilibili, YouTube and local videos. 项目地址&#xff1a; https://gitcode.com/gh_mirrors/bil/BiliSum 点击查看 免费下载 BiliSum 是一款…

作者头像 李华
网站建设 2026/11/6 3:29:14

火星探测车 DIY:复刻 JPL 摇臂转向架

火星探测车 DIY&#xff1a;复刻 JPL 摇臂转向架 【免费下载链接】open-source-rover A build-it-yourself, 6-wheel rover based on the rovers on Mars! 项目地址: https://gitcode.com/gh_mirrors/op/open-source-rover JPL Open Source Rover 把火星车的六轮摇臂转向…

作者头像 李华
网站建设 2026/11/6 3:28:28

terminal-mac Agent 技能实战:用 MCP 工具与 CLI 安全操控虚拟 Mac

【免费下载链接】terminal-mac Entire MacOS running in your terminal. 项目地址&#xff1a; https://gitcode.com/gh_mirrors/te/terminal-mac 点击查看 免费下载 本文以 terminal-mac 随包发布的 Agent 技能文档为主线&#xff0c;讲清楚一个 computer-use Agent 如何在一…

作者头像 李华
网站建设 2026/11/6 3:24:06

ADC+DWA

1.5V2.GND3. PA0 4.PD11使用DWA之前先看STM32的参考手册-DMA映像147&#xff0c;防止冲突你的现状&#xff1a;完全够用&#xff0c;互不干扰STM32F103 系列有两个 DMA 控制器&#xff0c;资源其实是挺丰富的&#xff1a;DMA1&#xff1a;有 7 个通道。DMA2&#xff1a;…

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

【芳芯科技】图像识别教室无人关灯系统

实物效果图&#xff1a;实现功能&#xff1a;1.采用ARM内核STM32单片机作为控制核心。2.采用OV7670摄像头实现图像获取。3.采用TFT2.8显示配合图像调试显示。4.通过按键进行布放&#xff0c;布放后采用图像算法进行检测&#xff0c;检测到有人体后通过电开关进行教室灯光的开启…

作者头像 李华