现状(用户实测,0.1.5)
整套时间轴渲染/播放引擎逻辑失效,到处是 bug,不可用:
已尝试的增量修复(均未能根治)
PR #144 在双表面模型上做了大量增量修复,但无法从根上解决:
架构根因(为什么增量修不好)
浏览器/WebView 里的**「双表面 + 双时钟」与上游「单表面 AVPlayer」**本质不兼容:
|
当前(双表面) |
上游(单表面) |
| 播放 |
DOM <video>(只 opacity,不合成变换/裁剪/文字) |
一个 AVPlayer 持续播出 composition |
| 暂停/scrub |
Rust composite_frame → 每帧 spawn 一个 ffmpeg + wgpu + PNG(→ 卡死根源 #92) |
同一 AVPlayerLayer 冻结在精确帧 |
| 时钟 |
两个 rAF/解码时钟靠状态机切换 → 切换处帧不一致(抽搐 #149) |
一个 composition 时钟,play/pause/seek/scrub 全走它 |
上游 VideoEngine.swift = 一个 AVPlayer + 一个 AVPlayerItem(composition + videoComposition + audioMix),永不抽搐、不卡死。我们在浏览器里用两套不同时钟驱动两个表面、并在暂停处做表面切换,所以注定有「切换帧不一致(抽搐)+ 逐帧合成(卡死)」。
真正的修复方向(非补丁)
停止给双表面打补丁,实现 #53 流式引擎(= 上游单表面的浏览器等价物):
关联
#142(剪辑/播放总根因 epic)、#92(逐帧合成卡死,CRITICAL)、#100(真实播放/scrub 引擎)、#53/#63/#64/#65(流式引擎及其子项)、#149(暂停/按钮)、#125(合成帧居中)、#131(编解码无缝切换缺口)。
给修复者
PR #144 的增量修复可作为「单时钟 + 实时拖拽 + 状态机选面」的脚手架参考,但渲染保真 + 不卡死 + 不抽搐三者必须靠 #53 重写才能同时满足。建议直接做 #53,不要再在双表面上叠补丁。
现状(用户实测,0.1.5)
整套时间轴渲染/播放引擎逻辑失效,到处是 bug,不可用:
已尝试的增量修复(均未能根治)
PR #144 在双表面模型上做了大量增量修复,但无法从根上解决:
previewEngine.ts(删除双时钟仲裁playbackClock+usePlaybackTicker)<video>seek)<img>+<TimelinePlayback>加pointerEvents:none(修按钮被遮挡 [P1][bug] 时间轴空格暂停:播放按钮状态不同步 / 无法续播 / 跳帧(焦点按钮 Space 双触发) #149)activeFrame吸附到 video 冻结帧(修抽搐 [P1][bug] 时间轴空格暂停:播放按钮状态不同步 / 无法续播 / 跳帧(焦点按钮 Space 双触发) #149)架构根因(为什么增量修不好)
浏览器/WebView 里的**「双表面 + 双时钟」与上游「单表面 AVPlayer」**本质不兼容:
<video>(只 opacity,不合成变换/裁剪/文字)AVPlayer持续播出 compositioncomposite_frame→ 每帧 spawn 一个 ffmpeg + wgpu + PNG(→ 卡死根源 #92)AVPlayerLayer冻结在精确帧上游
VideoEngine.swift= 一个AVPlayer+ 一个AVPlayerItem(composition + videoComposition + audioMix),永不抽搐、不卡死。我们在浏览器里用两套不同时钟驱动两个表面、并在暂停处做表面切换,所以注定有「切换帧不一致(抽搐)+ 逐帧合成(卡死)」。真正的修复方向(非补丁)
停止给双表面打补丁,实现 #53 流式引擎(= 上游单表面的浏览器等价物):
<canvas>/ 帧流(替换 PNG+base64 请求响应)关联
#142(剪辑/播放总根因 epic)、#92(逐帧合成卡死,CRITICAL)、#100(真实播放/scrub 引擎)、#53/#63/#64/#65(流式引擎及其子项)、#149(暂停/按钮)、#125(合成帧居中)、#131(编解码无缝切换缺口)。
给修复者
PR #144 的增量修复可作为「单时钟 + 实时拖拽 + 状态机选面」的脚手架参考,但渲染保真 + 不卡死 + 不抽搐三者必须靠 #53 重写才能同时满足。建议直接做 #53,不要再在双表面上叠补丁。