Skip to content

fix(player): 恢复全屏切换后的 MKV 视频解码器错误 - #104

Merged
mahoshojoHCG merged 2 commits into
mainfrom
codex/fix-mkv-fullscreen-decoder-recovery
Oct 2, 2026
Merged

mahoshojoHCG merged 2 commits into
mainfrom
codex/fix-mkv-fullscreen-decoder-recovery

Conversation

@mahoshojoHCG

@mahoshojoHCG mahoshojoHCG commented Sep 27, 2026 •

Copy link
Copy Markdown
Contributor

问题与定位

iPad Safari 的 MKV 前端播放在进入系统全屏后触发原生视频解码错误,立即转到服务端 HLS。真机日志显示:进入全屏约 180 ms 后发生 EncodingError: Decoder failure,当时页面仍可见、AudioContext 仍在运行;之后才发生暂停、退出全屏和播放器销毁。同一文件不进入全屏可以持续播放。

已将线上 bundle 的三个堆栈位置映射到 VideoDecoderWrapper → VideoSampleSink._createDecoder() → mediaSamplesInRange()。堆栈来自库在创建 decoder 时保存的 stack,实际错误由原生 VideoDecoder.error 回调报告。WebKit 将底层解码失败汇总为 Decoder failure,JavaScript 侧无法读取具体平台错误码,因此不能进一步断言是某个硬件 session 错误。

销毁后的 VideoSample GC 警告还有明确的清理缺陷:代理内嵌的旧 Mediabunny 没有在 producer 异常退出时可靠关闭 decoder,并且对已经因报错关闭的 native decoder 再次调用 close(),会跳过后续帧队列释放。项目单独依赖的 Mediabunny 已有相应修复,但代理播放使用的是包内嵌实现。

修改

  • 保留系统全屏。在真实原生全屏状态转换后的 3 秒内,对正在播放的视频 EncodingError 尝试一次 decoder 重建,从当前音频位置对应的关键帧重新解码,保留 Canvas、音频时钟、字幕与全屏元素。
  • 恢复 token 绑定当前解码代次,并在首次等待前消费。seek、重新加载和销毁会使旧恢复失效;恢复超过 5 秒或新 decoder 再次失败时仍走原有 HLS 回退。
  • 补齐异常/取消路径的 decoder、取包迭代器和样本队列释放,唤醒阻塞的 producer;关闭 native decoder 前检查其状态。
  • 更新现有 Yarn patch 的 ESM、CommonJS、legacy 三个入口和锁文件,同步架构说明。压缩入口由修订后的 ESM 重新生成;原有音视频调度补丁保留。

参考:WebKit 解码结果回调、WebCodecs 的 decoder 关闭语义、Mediabunny 1.55.3 的 iterator/decoder 清理。

验证

  • yarn install --immutable:通过。
  • yarn test:unit:34 项通过。
  • yarn typecheck:通过。
  • yarn build:budget:生产构建及包体积检查通过。
  • 三个发行入口语法检查、模块加载检查及 git diff --check:通过。
  • 未新增测试或回归检查。

按本次合并请求转为可审阅;实体 iPad Safari 复测仍未完成。现有验证确认构建和既有行为检查通过,尚未证明发生该原生错误后,一次 decoder 重建在用户设备上必然成功。

@mahoshojoHCG
mahoshojoHCG marked this pull request as ready for review October 2, 2026 09:42
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 2, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-02T09:46:43.427370Z a2b5e9a Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@mahoshojoHCG
mahoshojoHCG merged commit 8600899 into main Oct 2, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant