背景
倍速需求分散在多个 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 长按倍速无效 #2103 、ios长按倍速卡顿 #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. 顺带修复
任务拆分
Related
背景
倍速需求分散在多个 issue 中:档位固定不够细(#2780、#2823)、换集后不保持(#2547)、快捷键切换无反馈(#2302、#2193)、iOS 倍速行为与 UI 不一致(#2103、#2641)。#3026 做过一轮汇总,本 issue 给出统一设计并跟踪实现。
现状实现
PlaybackSpeedfeature 的内存态,挂在MediampPlayer实例上;player 由EpisodeViewModel创建,生命周期即当前 Subject 的播放会话,无任何持久化。PlaybackSpeedControllerState强绑定档位 List:要求单调递增、必须含 1.0f,speedUp()/speedDown()按 index 步进。AVKitPlaybackSpeed)在播放 item 结束或替换后AVPlayer.rate被系统归零,但内部_value仍显示旧倍速——换集后实际 1.0x 播放、UI 显示旧值。这是 ios 长按倍速无效 #2103、ios长按倍速卡顿 #2641 的可能根因。设计
1. 倍速生命周期
SettingsRepository),初始 1.0x。PlaybackSpeedControllerState的初始值从设置读取。2. 播放页:档位 List 改为 Slider
PlaybackSpeedControllerState重写为纯数值逻辑(clamp、步进),删除档位 List 的单调递增与必含 1.0f 校验。3. 设置页新增选项(设置 → 播放器)
4. 快捷键
GestureIndicatorState指示器),显示当前倍速(如1.75x)。对应 切换倍速的快捷键略显鸡肋 #2302。5. 顺带修复
play()与 media item 切换后重新应用_value的 rate,履行PlaybackSpeed的跨视频保持契约。对应 ios 长按倍速无效 #2103、ios长按倍速卡顿 #2641。任务拆分
PlaybackSpeedControllerState重写:数值步进、clamp、范围来自设置Related