Skip to content

RGBBeat v2.2.0 - 礼物特效修复版

Choose a tag to compare

@wumisc wumisc released this 08 Nov 13:03
· 12 commits to main since this release

⚠️ 此版本存在严重问题:礼物特效播放时,桌面与本 App 的触摸会被遮挡层挡住(v2.2.0 / v2.2.1 均受影响)。请升级到 v2.2.2。

RGBBeat v2.2.0 — 礼物特效修复版

本版本按维护者要求用修复版覆盖旧代码基线。v2.1.0 的液态玻璃导航栏、Gradle 9.3 / AGP 9.1 工具链与音效相关改动在本版本中不再包含;versionCode 13 > v2.1.0 的 12。

⚠️ 本 APK 为 debug 签名(工程未配置 release keystore)。若你安装的是官方 release 签名版本,需先卸载再安装,签名不一致无法直接覆盖。

礼物特效:居中、透明、完整呈现

  • 新增 EffectGlSurfaceView:GLSurfaceView + OES 外部纹理,片元着色器做自适应背景抠除(局部对比度 + 彩度)。黑 / 白 / 灰 / 渐变底一律变全透明,只保留线条、粒子、星点与彩色流光;视频上下边缘羽化,消除底部雾状硬边。
  • 新增 EffectLayout:按素材原始宽高比 FIT_CENTER 居中,横屏素材(1568×720 / 992×720 / 896×528)完整呈现、不裁切、不拉伸。
  • 新增 EffectKeyMode 与设置项「背景抠除模式」:自动(默认)/ 纯黑底 / 浅色·白底 / 不抠(排查用),切换后立即重绘,正在播放也生效。
  • 新增 EffectTint 与设置项「礼物特效颜色」:三段素材统一染色,默认白里粉 #FFB7D8(亮部收成白芯、中间调透粉),按亮度调制保留层次;可选心形粉 #FF29B7 / 玫瑰紫 / 极光青 / 深海蓝 / 鎏金橙 / 荧光绿 / 中国红 / 素材原色。解决白色线条在浅色界面上不明显、三段颜色不统一的问题。旧版保存过默认「心形粉」的会被一次性迁移到白里粉。
  • 修复 TextureView 初始 GONE 导致系统不创建 SurfaceTexture、视频永远播不出来;改为始终 VISIBLE 的 GL Surface + ready 回调补播。
  • 修复 stop() 把轮播索引重置为 -1,导致三段视频永远只播第一段;抽出 EffectPicker 并加回归测试。
  • 修复用只持续一帧的 state.beat 做触发条件导致漏触发;改用 BeatState.beatSeq 单调序号做边沿检测,冷却 12s 防刷屏。
  • 震动改为遵循用户开关与强度;补 onError 复位、Surface/MediaPlayer 成对释放、服务/窗口销毁时完整 release()。

一轮逻辑复查后补的两处修复

  • 播放状态机可能卡死:prepareAsync() 之后如果解码器迟迟不回调 onPrepared/onError(部分 ROM 上 Surface 中途重建、或素材解码器初始化失败时会出现),playing 会永久为 true,LightRenderer 的「未在播放」判断从此恒假,礼物特效再也触发不出来。新增 6 秒 prepare 看门狗:超时未真正开播就 stop() 复位,并把「已开播」与「准备中」拆成 startedPlaying 两个状态。
  • 开机后前 12 秒不触发:lastHighlightTrigger 初值为 0,而冷却判断用 elapsedRealtime(),开机不足 12 秒时第一拍会被冷却挡掉。初值改为 -HIGHLIGHT_COOLDOWN,首次命中立即生效。

设置与工程链路

  • 关键修复:设置页写 <包名>_preferences,服务与首页读 rgbbeat,两个文件不通,所有设置(含礼物特效开关)改了都不生效;已统一为 rgbbeat 并自动迁移旧值。
  • 补齐设置页与首页的特效开关、特效选择、「立即预览礼物特效」。
  • 恢复被误删的 build.gradle / settings.gradle / app/build.gradle。
  • 恢复被整段注释掉的 3D 粒子绘制(默认仍关闭)。
  • 修正单测仍用旧构造函数签名、SeekBar 默认值与 Prefs 不一致等编译/行为问题。
  • 三段素材由 HEVC(hvc1)、moov 在文件尾,转为 H.264 Main / yuv420p / moov 前置 / 无音轨,兼容 Android 8.0+ 硬解;原始 HEVC 素材保留在源码包 original-hevc-mp4/。

验证

  • 真实构建:JDK 21 + Gradle 8.14 + Android SDK 35,clean assembleDebug testDebugUnitTest BUILD SUCCESSFUL。
  • 45 个 JVM 单元测试全部通过,0 失败(含新增 EffectKeyModeTest / EffectLayoutTest / EffectPickerTest / EffectTintTest)。
  • 19 个 XML 与资源引用一致性校验 0 错误。

安装与使用

  1. Android 8.0+,授予悬浮窗权限;LSPosed 模块需勾选启用并重启。
  2. 安装本 Release 的 APK(debug 签名;与官方 release 签名不同时需先卸载)。
  3. 开启服务 → 首页「立即预览礼物特效」即可验证。
  4. 若换了素材仍有雾状残留:设置 → 高潮礼物特效 → 背景抠除模式,切到对应底色模式。

仓库变更

  • README 全面重写:补充礼物特效渲染原理(解码 → OES 纹理 → 自适应抠背景 → FIT_CENTER → 染色 → 预乘 alpha 合成)、特效相关设置项、故障排查(prepare timeout / 只播第一段 / 底部灰雾 / motion 模式不触发)、工程结构更新到当前全部类;许可证更正为 AGPL-3.0(与仓库 LICENSE 一致,原文误写为 GPL-3.0)。
  • 新增 Gradle Wrapper(gradlew / gradlew.bat / gradle/wrapper/*,Gradle 8.14),可直接 ./gradlew assembleDebug。
  • 删除旧实现文件:main 分支上的 8 个液态玻璃 Kotlin 文件已移除(见上),仓库内容替换为本版本源码。

与 v2.1.0 的具体差异(覆盖前请确认)

  • 远端 HighlightEffectsRenderer 仍是 TextureView GONE + stop() 重置轮播索引的旧实现(视频依旧播不出来、只播第一段),本版本整体重写。
  • 覆盖后 main 上不再有 8 个液态玻璃相关 Kotlin 文件:LiquidBottomTab.kt / LiquidBottomTabs.kt / MainNav.kt 及 com.kyant.backdrop 下 5 个 utils 文件;Gradle 9.3 / AGP 9.1 / Kotlin Compose 工具链也回退到 Gradle 8.14 / AGP 8.5.2 / 纯 Java。
  • 远端最后一次提交把礼物特效触发条件改成 energy > 0.1 + 5s 冷却(去掉 beat 条件);本版本用的是 BeatState.beatSeq 节拍边沿 + 12s 冷却。若希望保留「只要有能量就触发」,把 LightRenderer 的触发判断改为「能量阈值 或 节拍边沿」即可。
  • 提交历史不会丢:发布脚本以远端当前 HEAD 作为新提交的 parent,代码内容被覆盖、历史保留。

已知限制

  • GL 色键在运行时编译,阈值位于 EffectGlSurfaceView.FRAGMENT_SHADER(sstep(0.025, 0.14, edge) / sstep(0.05, 0.22, chroma)),不同设备观感可能需要微调。
  • 三段 mp4 无 alpha 通道,靠着色器抠背景;纯白界面上的白色线条对比度会偏低。
  • 触发条件仍是「节拍命中」。晕车(motion)模式没有音频输入,beatSeq 不递增,因此该模式下礼物特效不会自动触发(手动预览不受影响)。如需该模式也播放,把 LightRenderer 的触发条件改成「节拍边沿 或 能量超过阈值」即可。