GSYVideoPlayer 如何在 Jetpack Compose 中用 GSYVideoPlayerView 快速播放视频并处理生命周期
GSYVideoPlayer 如何在 Jetpack Compose 中用 GSYVideoPlayerView 快速播放视频并处理生命周期【免费下载链接】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如果你的界面已经用 Jetpack Compose 编写想在不退回 XML 布局的情况下播放视频并且希望播放器能跟随页面生命周期自动暂停、恢复和释放GSYVideoPlayer 的gsyVideoPlayer-compose模块提供的 Wrapper 模式就是直接的路径一个GSYVideoPlayerViewComposable 把StandardGSYVideoPlayer包进 Compose 屏默认自动桥接onPause/onResume并在离开 Composition 时自动release()。完成本文操作后你在 Compose 屏里可以起播一段视频切走页面再回来时播放状态正确恢复。适用前提来自模块文档minSdk ≥ 23Kotlin 2.0.xAGP 8.6本机 JDK ≥ 17README 说明该模块在 CI 用 JDK 21、本地用 JDK 17 验证两者都可以只要本机 JDK ≥ 17 就能跑通 Kotlin 2.0.21 AGP 8.6.1compose-bom已由模块以api方式透出模块内部用compose-bom 2024.06.00统一版本使用 Compose Compiler Gradle Plugin无需再单独指定composeCompilerVersion你自己的androidx.compose.*依赖仍按自身工程版本管理。引入 gsyVideoPlayer-compose 依赖在 app 模块的 Gradle 依赖里二选一见 README.md 第 D 节与 doc/COMPOSE_USE.md// 方式 AMaven Central外部项目推荐 implementation io.github.carguo:gsyvideoplayer-compose:13.2.1 // 方式 B在 GSYVideoPlayer 仓库内开发调试时直接源码依赖 implementation project(:gsyVideoPlayer-compose)模块本身已api依赖gsyVideoPlayer-java不需要重复引入。只有需要 EXO / Ali 内核时才按 README 原有方式额外引入对应坐标。注意两处文档的版本差异doc/COMPOSE_USE.md 正文示例写的是首发版本13.1.0而 README.md 给出的是当前坐标13.2.1按 README 的13.2.1使用即可。第一次起播GSYVideoPlayerView GSYVideoOptionBuildersetUp参数里的写法与在 XML 里拿到 player 后调用builder.build(player)完全等价。最小可用示例取自 doc/COMPOSE_USE.md 的 Cookbook「最小播放」Composable fun MyVideoScreen(url: String) { GSYVideoPlayerView( modifier Modifier .fillMaxWidth() .aspectRatio(16f / 9f), setUp { player - GSYVideoOptionBuilder() .setUrl(url) .setVideoTitle(Compose Demo) .setIsTouchWiget(true) .build(player) player.startPlayLogic() }, // 默认会自动桥接 onPause/onResume 与离屏 release autoPauseResume true, autoReleaseOnDispose true, ) }url替换为你自己的视频地址。想先跑通验证可以直接用仓库 demo 的同款测试 URL——DemoVideoUrls.java 中的SAMPLE_GSY https://res.exexm.com/cw_145225549855002demo 各 Compose Activity 的DemoSamples.SAMPLE_URL用的就是它。按需追加的高频 builder 选项在 BasicWrapperActivity.kt 里有完整演示.setCacheWithPlay(true)demo 界面里对应「边播边存」开关.setRotateViewAuto(true).setLockLand(true).setNeedLockFull(true)自动旋转横屏全屏、锁定横屏、全屏锁屏全屏由内部OrientationUtils接管.setVideoAllCallBack(object : GSYSampleCallBack() { ... })在onPrepared/onAutoComplete/onPlayError/onClickStartIcon里做埋点或更新 UI 状态。一个容易踩的点仓库里的BasicWrapperActivitydemo 并不是自动起播——它通过onPlayerCreated { playerRef it }拿到 player 引用由界面底部「开始播放」按钮手动调playerRef?.startPlayLogic()builder 里虽设了setStartAfterPrepared(true)仍需按钮触发。如果你按上面的最小示例把startPlayLogic()写进setUp则进入页面即播。两种写法都以 demo 为准对照即可。URL 变化时如何重新播放setUpKeysetUp默认只在 factory 阶段调用一次这是有意设计每次 recomposition 都重新执行builder.build(player)会重置 URL、重启播放反而制造问题。因此 update 阶段默认是 no-op。如果 URL 等参数变化时希望主动重跑setUp传setUpKeyGSYVideoPlayerView( setUp { player - GSYVideoOptionBuilder().setUrl(url).build(player) player.startPlayLogic() }, setUpKey url, // url 变化时再次调用 setUp否则 update 阶段是 no-op )setUpKey为null默认时兼容老用法。需要其它NormalGSYVideoPlayer子类如ListGSYVideoPlayer、SampleControlVideo时改用通用版GSYAnyVideoPlayerView通过factory { ctx - SampleControlVideo(ctx) }指定创建方式。生命周期暂停、恢复与释放Wrapper 模式下生命周期不需要手写两个参数默认都为trueautoPauseResume true内部通过 Lifecycle 桥接LifecycleBridge.kt 的LifecycleEffect把Lifecycle.Event.ON_PAUSE → GSYVideoManager.onPause()、ON_RESUME → GSYVideoManager.onResume()autoReleaseOnDispose true组件离开 Composition页面销毁时自动调用player.release()可显式关闭。桥接逻辑的实现在 GSYVideoPlayerView.ktLifecycleEffect注册LifecycleEventObserverDisposableEffect(Unit) { onDispose { ... } }负责离屏 release。如果需要在切走页面时自己决定行为比如只暂停不释放、或切换音频焦点策略传autoPauseResume false文档给出的替代做法是自己用LifecycleEffect监听事件并手动调用GSYVideoManager对应方法。全屏能力与原生一致在setUp或回调里直接调底层player.startWindowFullscreen(...)返回键拦截在BackHandler { ... }内调用player.onBackFullscreen()。验证播放是否成功两种验证路径都来自仓库文档。路径一跑仓库自带的 demo 应用确认环境。编译运行 app 模块后Compose 入口在Compose DemoComposeDemoListActivity.kt其中第 1 项「P0 · Wrapper 基础」即BasicWrapperActivity。doc/COMPOSE_TEST_PLAYBOOK.md 给出的定位方式是直接启动列表页adb shell am start -n com.example.gsyvideoplayer/.compose.ComposeDemoListActivity进入「P0 · Wrapper 基础」后注意它不自动起播需要点界面底部的「开始播放」按钮。播放成功的判定信号Ijk 默认内核logcat -d过滤信号含义onPrepared≥ 1准备完成CURRENT_STATE_PLAYING≥ 1进入播放态MEDIA_INFO_VIDEO_RENDERING_START≥ 1画面开始渲染Net speed:≥ 1边播边存网络进度playbook 对普通 Ijk 自动起播的 PASS 条件是prep ≥ 1 play ≥ 1 render ≥ 1 net ≥ 1并要求全局FATAL EXCEPTION 0 ANR 0adb logcat -d -b crash | grep -c FATAL EXCEPTION。滚屏定位等辅助脚本在 doc/test_scripts/find_xy.py、locate_and_test.sh、real_test.sh。路径二在你自己的 App 里验证。用同样的 Ijk 内核日志信号即可接入后先确认onPrepared出现或setVideoAllCallBack的onPrepared回调被触发再看CURRENT_STATE_PLAYING与MEDIA_INFO_VIDEO_RENDERING_START出现onPlayError/CURRENT_STATE_ERROR类日志则说明 URL 或内核初始化有问题。如果你的播放器走 EXO 内核见下节渲染信号改为videoSizeChanged/videoWidth:且 EXO 路径不打Net speed:。边界与后续Wrapper vs NativeGSYVideoPlayerView保留 GSY 全部内置 UI全屏、手势、字幕、弹幕、滤镜与 Java/XML demo 一一对应是「存量业务最快平移」的路径。如果目标是控制层完全用 Compose 自绘、用controller.events/stateFlow流式驱动 UI文档给出的替代是 Native 模式GSYComposePlayer GSYPlayerController两条链路可共用同一份 Builder 配置可先 Wrapper 跑通再按需局部替换。内核切换不受 Compose 模块影响写法与原版一致PlayerFactory.setPlayManager(Exo2PlayerManager::class.java)对应缓存管理用CacheFactory.setCacheManager(ExoPlayerCacheManager::class.java)。能力缺口与路线图当前 Wrapper/Native 的能力差异矩阵列表多 item、真并行多窗口、跨 Activity 复用等场景各自的限制和已知缺口记录在 doc/COMPOSE_BACKLOG.md接入前建议过一遍「九、能力矩阵」章节确认你的场景落在 ✅ 列而不是 ❌ 列。仓库内还有 24 个可运行 Compose Activity 可按需对照入口文件见 doc/COMPOSE_USE.md 第六节的完整索引表如SwitchUrlActivity演示 Wrapper 切流、MultiWindowParallelComposeActivity演示并行多窗口。【免费下载链接】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),仅供参考

相关新闻

无迹卡尔曼滤波在电池SOC估计中的应用与Simulink实践

无迹卡尔曼滤波在电池SOC估计中的应用与Simulink实践

简介:面向电池管理系统(BMS)工程师和新能源汽车、储能等领域的算法研究人员,这份资料聚焦动力电池SOC估计问题,以无迹卡尔曼滤波(UKF)为核心,在Simulink环境中给出了一套可运行的仿真…

2026/9/13 17:35:13 阅读更多 →
Bazel 与 ProGuard 优化步骤完全指南:从 -optimizations 过滤器到 Gson 代码注入

Bazel 与 ProGuard 优化步骤完全指南:从 -optimizations 过滤器到 Gson 代码注入

Bazel 与 ProGuard 优化步骤完全指南:从 -optimizations 过滤器到 Gson 代码注入 【免费下载链接】bazel a fast, scalable, multi-language and extensible build system 项目地址: https://gitcode.com/GitHub_Trending/ba/bazel 本篇技术指南以 Bazel 仓库…

2026/9/13 17:34:13 阅读更多 →
基于STM32的智能家居系统设计:从硬件搭建到代码实现全解析

基于STM32的智能家居系统设计:从硬件搭建到代码实现全解析

1. 先聊点实在的:嵌入式老人怎么看“智能家居”这个题目前阵子一个朋友发消息问我,说想做一个毕设/课程设计级别的智能家居项目,网上搜了一圈全是“智能家居系统设计”的论文和PPT,要么太抽象、要么抄来抄去,真到了写代…

2026/9/13 17:34:13 阅读更多 →

最新新闻

Mastra ClickHouse vNext 可观测性设计解析:五大信号的表结构与查询契约

Mastra ClickHouse vNext 可观测性设计解析:五大信号的表结构与查询契约

Mastra ClickHouse vNext 可观测性设计解析:五大信号的表结构与查询契约 【免费下载链接】mastra Mastra is the modern TypeScript framework for AI-powered applications and agents. 项目地址: https://gitcode.com/GitHub_Trending/ma/mastra 本文是 Ma…

2026/9/13 19:30:04 阅读更多 →
Archon 工作流节点级 MCP 服务器接入指南:为 DAG 节点按需挂载外部工具

Archon 工作流节点级 MCP 服务器接入指南:为 DAG 节点按需挂载外部工具

Archon 工作流节点级 MCP 服务器接入指南:为 DAG 节点按需挂载外部工具 【免费下载链接】Archon The first open-source harness builder for AI coding. Make AI coding deterministic and repeatable. 项目地址: https://gitcode.com/GitHub_Trending/archon3/A…

2026/9/13 19:30:04 阅读更多 →
Jenkins 如何设置代理的  of executors 并发数,并用 0 临时下线代理?

Jenkins 如何设置代理的 of executors 并发数,并用 0 临时下线代理?

Jenkins 如何设置代理的 # of executors 并发数,并用 0 临时下线代理? 【免费下载链接】jenkins Jenkins automation server 项目地址: https://gitcode.com/GitHub_Trending/je/jenkins 在 Jenkins 的 Master/Agent 部署中,每个节点&…

2026/9/13 19:30:04 阅读更多 →
Label Studio Enterprise 2.36.1 版本解析:SCIM 组同步部分失败上报修复与自定义界面迁移列自动检测修复

Label Studio Enterprise 2.36.1 版本解析:SCIM 组同步部分失败上报修复与自定义界面迁移列自动检测修复

Label Studio Enterprise 2.36.1 版本解析:SCIM 组同步部分失败上报修复与自定义界面迁移列自动检测修复 【免费下载链接】label-studio Label Studio is a multi-type data labeling and annotation tool with standardized output format 项目地址: https://git…

2026/9/13 19:30:04 阅读更多 →
Office多久能用上?LKY Office Tools自动下载、安装、激活完整路线

Office多久能用上?LKY Office Tools自动下载、安装、激活完整路线

Office多久能用上?LKY Office Tools自动下载、安装、激活完整路线 【免费下载链接】LKY_OfficeTools 一键自动化 下载、安装、激活 Office 的利器。 项目地址: https://gitcode.com/GitHub_Trending/lk/LKY_OfficeTools LKY Office Tools是一款面向 Windows …

2026/9/13 19:30:04 阅读更多 →
电机控制工程师实战成长地图:从硬件感知到FOC系统闭环

电机控制工程师实战成长地图:从硬件感知到FOC系统闭环

1. 这不是“速成指南”,而是一份电机控制工程师的实战成长地图电机控制不是调个PID参数就能交差的活儿。我带过三届校招新人,也帮五家中小厂做过电控系统技术把关,见过太多人卡在同一个地方:简历上写着“熟悉FOC”,面试…

2026/9/13 19:29:03 阅读更多 →

日新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/13 0:00:24 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/13 0:00:24 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/13 0:00:24 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/13 0:00:24 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/13 0:00:24 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/13 0:00:24 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/13 16:51:11 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/12 18:29:34 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/12 19:02:44 阅读更多 →