Skip to content

倍速系统重做:全局 Slider、自定义范围与生命周期管理 #3177

Description

@NihilDigit

背景

倍速需求分散在多个 issue 中:档位固定不够细(#2780#2823)、换集后不保持(#2547)、快捷键切换无反馈(#2302#2193)、iOS 倍速行为与 UI 不一致(#2103#2641)。#3026 做过一轮汇总,本 issue 给出统一设计并跟踪实现。

现状实现

  • 倍速是 mediamp PlaybackSpeed feature 的内存态,挂在 MediampPlayer 实例上;player 由 EpisodeViewModel 创建,生命周期即当前 Subject 的播放会话,无任何持久化。
  • 同一 Subject 内换集(手动选集 / 自动连播)复用同一 player,按 mediamp 接口契约倍速保持;退出播放页后丢失。
  • PlaybackSpeedControllerState 强绑定档位 List:要求单调递增、必须含 1.0f,speedUp()/speedDown() 按 index 步进。
  • iOS 已知问题:AVKit 后端(AVKitPlaybackSpeed)在播放 item 结束或替换后 AVPlayer.rate 被系统归零,但内部 _value 仍显示旧倍速——换集后实际 1.0x 播放、UI 显示旧值。这是 ios 长按倍速无效 #2103ios长按倍速卡顿 #2641 的可能根因。

设计

1. 倍速生命周期

  • 默认倍速:持久化在设置(SettingsRepository),初始 1.0x。
  • 会话倍速:进入 Subject 播放页时以默认倍速初始化;同一 Subject 内换集保持;切换到其他 Subject 时重置为默认倍速。
  • 播放页内的调整只改 player 内存态,不自动写回设置;PlaybackSpeedControllerState 的初始值从设置读取。

2. 播放页:档位 List 改为 Slider

  • Slider 步进 0.1,密度上接近无级调节,不提供 +/- 微调按钮,UI 只显示当前值。
  • 在 0.25 的倍数(0.5x、0.75x、1.0x……)上吸附,吸附窗口 ±0.05,只在接近时生效,不牺牲 0.1 分辨率。吸附点与快捷键的 0.25 步进一致,两种操作方式停在同一组值上。
  • 范围由设置页的自定义边界决定(见下节),默认 0.5x–3.0x。
  • 提供"设为默认"操作(按钮或"记住此速度"勾选):把当前会话倍速写入持久化默认值,之后所有新 Subject 会话以此起播。
  • PlaybackSpeedControllerState 重写为纯数值逻辑(clamp、步进),删除档位 List 的单调递增与必含 1.0f 校验。

3. 设置页新增选项(设置 → 播放器)

  • 倍速范围:自定义 Slider 上下限。校验:下限 < 上限,且都在内核可正常工作的区间(0.25x–4.0x)内;缩小范围时对当前默认倍速做 clamp。
  • 长按倍速行为(二选一):
    • 开(默认):长按按当前会话倍速的 2 倍播放,clamp 到范围上限;达到上限后长按无额外效果。
    • 关:出现独立 Slider,自定义长按目标速率(步进 0.1,同样受范围约束)。

4. 快捷键

  • A / D 步进改为 0.25,语义从"档位 List index 步进"改为数值步进,clamp 到范围。
  • 新增数字键直切:1 → 1.0x,2 → 1.5x,3 → 2.0x(固定映射,当前未被占用)。
  • 保留 S 键重置 1.0x。
  • 所有快捷键调整倍速时给出明显提示(Toast 或复用 GestureIndicatorState 指示器),显示当前倍速(如 1.75x)。对应 切换倍速的快捷键略显鸡肋 #2302

5. 顺带修复

任务拆分

  • 设置:持久化默认倍速 + 倍速范围(上下限)+ 长按行为(Toggle / 独立 Slider)
  • PlaybackSpeedControllerState 重写:数值步进、clamp、范围来自设置
  • 播放页 UI:Slider(0.1 步进,0.25 倍数吸附)+ 当前值显示 + "设为默认"
  • 会话初始化:新 Subject 会话以默认倍速起播
  • 长按倍速:×2 clamp / 独立 Slider 两种模式
  • 快捷键:A/D 0.25 数值步进 + 1/2/3 直切常用倍速 + Toast/指示器提示
  • iOS:AVKit rate 恢复(ios 长按倍速无效 #2103ios长按倍速卡顿 #2641

Related

Metadata

Metadata

Assignees

Labels

ios平台: iOSs: player子系统: 视频播放器s: settings子系统: 设置页

Fields

No fields configured for Feature.

Projects

Status
Backlog

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions