Files
ArtPlayer/refactor/hls-validation.md
T

119 lines
8.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HLS control 测试与环境边界
PKG-HLS-03 已在入口、映射、菜单和 SDK 订阅四个模块实施修复,实际地图见
[包内架构](../packages/artplayer-plugin-hls-control/ARCHITECTURE.md),本轮证据见
[模块验证](baselines/hls-modules-validation.json)。下方 02 的数量与缺陷观察属于冻结的迁移前基线。
新版用例增加事件同步、菜单节点复用和候选生命周期断言,公开 TS 迁移仍是 04。
新增构建文件入口:ARTPLAYER_TEST_HLS 以平台路径分隔符接受 main/legacy/ESM,用于同一 Node
契约;ARTPLAYER_HLS_ARTIFACT 选择实际 main/legacy 浏览器文件。测试记录实际 hash,错误路径
明确失败。这是工作区构建验证;隔离安装以及整套 ARTPLAYER_BROWSER_ARTIFACTS 映射仍由 06 完成。
PKG-HLS-02 建立迁移前基线。源码目前仍为 src/index.js,不能把测试任务当作 TS 迁移已完成。
来源见 [发布契约](baselines/hls-control-contract.md)、[SDK 固定记录](baselines/hls-sdk.json)、
[本轮证据](baselines/hls-validation.json)。
## 可重跑入口
- `node --test test/hls-control.test.js`:45 项,源码与发布 main/legacy/ESM 共用正常契约,
发布包单独复现旧缺陷;已接入 `yarn test:unit`。
- `yarn test:browser hls-control.spec.js`:当前源码与发布插件在旧核心 5.4.0/当前核心上的四组合,
加上 SDK 能力检查。通过现有 Playwright 工程入口执行;源码候选构建不写 dist。
- `node refactor/scripts/hls-contract.mjs`:HLS 插件发布来源核验。
- `node scripts/generate-hls-fixture.mjs <新的输出目录>`:只在需要改变样本时执行;
测试使用已提交媒体和 manifest,不要求安装 FFmpeg。详见 test/browser/media/hls/README.md。
SDK 使用示例原有的 Hls.js 1.5.17,首次从固定 npm URL 下载并验证 SHA-512/SHA-256,
代码取归档中的 dist/hls.min.js。SDK 仅在测试浏览器执行,不加生产依赖,不改 Yarn 锁文件。
归档读取工具允许合法的点分包名 hls.js,同时测试拒绝路径穿越等非法标识。
生成器记录 FFmpeg 版本和参数;媒体源为 testsrc2/sine,不依赖远程影片版权或服务可用性。
## 已验证的内容
Node 契约覆盖同步注册/update、媒体身份校验、quality/audio 显示开关、名称/顺序/去重、
getName 输入引用与一参/两参调用、SDK 写入→notice→check 顺序、回调/SDK 异常传播、替换实例。
这些受控测试不提供 DOM、实际 ABR 或媒体解码证明。
Chromium 与 Firefox 各 14 项播放/失败组合通过,另各 1 项 SDK 能力检查通过:
本地两档位和双音轨、可见画面像素与解码帧、实际播放推进、90P→180P、返回 Auto、French
音轨切换完成事件、暂停/seek/继续、503 manifest 失败后恢复、切到无音轨 master、SDK 与核心销毁。
选择通过真实鼠标操作控件;属性、画面和 SDK 事件联合断言,不只验证菜单文字。
旧版真实 Auto 状态下 update 将标签改成当前播放档位;旧版切到无音轨 master 后仍保留音轨控件。
旧菜单回调写旧实例、destroy 后公开 update 继续工作在受控测试复现;后者不是浏览器泄漏定量证明。
SDK 在当前双音轨样本中将 id 与选择索引对齐,没有把静态 id/index 差异误报为已复现错误。
## Windows WebKit 缺口必须保留
首轮完整三引擎 28 通过、14 失败。定向诊断确认 Windows Playwright WebKit 26.6 的
MediaSource 和 ManagedMediaSource 均为 undefined,Hls.isSupported() 为 false,实际 SDK
报告 manifestIncompatibleCodecsError。新旧核心与插件共同受影响,不是 TS 候选特有回归。
最终报告为 **31 passed、14 skipped、0 failed**:WebKit 只通过显式能力/失败清理断言;
14 个播放场景按这个已经验证的宿主限制跳过。能力测试会在环境变化时失败提醒重新核对,
不能把跳过转换为播放通过。最初失败和定向诊断报告的摘要/完整性保留在冻结证据中。
Safari/macOS/iOS 的真实 MSE/ManagedMediaSource 与原生 HLS fallback 仍由 PKG-HLS-05、
EX-03、REL-09/REVIEW-02 接续,SDK-01/HLS-ENV-01 保持 open。
本轮 enableWorker=false,流通过 Playwright 本地路由提供。远端网络、SDK worker、分组音轨变更、
Safari/native fallback、更多 SDK 版本、安装包及示例页面全部组合不是本轮完成内容。
显式安装产物映射暂不接受 HLS 源码回退;HLS-06 必须加入 HLS 包对应映射和隔离 tarball 消费。
## PKG-HLS-03/04 后续验证
PKG-HLS-03 已拆出映射、UI 提交/删除、Hls 订阅与生命周期;旧缺陷成为候选修复断言,
保留发布版观察。该步最终 Node 专项 56 通过,三格式共享契约累计 83 通过,modern/legacy
浏览器各 35 通过、16 跳过;以上早期 02 结果保持其原始范围,不冒充当前源码结果。
PKG-HLS-04 把五个模块迁移为严格 TS,公开类型保留旧调用和类型提取习惯,补齐默认字段、
SDK 泛型、可选 index 和 CJS/ESM/legacy 声明路径。在线编辑器声明从公开源生成,构建时用
TS 4.3/5.9 严格校验;真实 Monaco 验证推断、错误提示及编译后的工厂执行。
这些编辑器用例不声称执行 HLS 播放,实际播放仍由 hls-control.spec.js 负责。
本步结果见 [类型迁移记录](changes/2026-09-12-PKG-HLS-04-types.md) 和
[冻结证据](baselines/hls-types-validation.json)。
实际 Hls.js 1.5.17 声明在 TS 4.3 缺少 MediaDecodingConfiguration 和
MediaCapabilitiesDecodingInfo;仅 SDK 的消费者也出现相同两个诊断。插件无新增诊断,
不注入虚假 DOM 定义或打开 skipLibCheck。独立插件五组类型模式均要求零诊断。
PKG-HLS-05/06 继续完整 SDK、浏览器、示例及安装包验收,SDK-01/HLS-ENV-01 仍开放。
## PKG-HLS-SDK-01 桌面 SDK 扩展
本子任务作为 PKG-HLS-05 前置单独交付,不降低父任务的设备/SDK 验收条件。
test/browser/hls-sdk.spec.js 使用冻结的 Hls.js 1.5.17/1.7.2 和真实 native Worker:
监听 init/transmuxComplete 消息、错误与 terminate,并且同时验证视频帧、时间推进和销毁。
只有 enableWorker=true 或仅创建 Worker 不算通过;实际转封装结果和清理是断言的一部分。
这些探针委托原生操作,不注入模拟转封装输出。SDK 仍为测试归档,不进入生产依赖。
worker 切源/清理覆盖两个 SDK 与新旧核心/插件四组合;候选插件另测 detach/reattach、
两档位不同音轨组、组内重新编号和实际 SDK 切轨完成事件、鼠标选择与 UI 清理。
高档组有 French/English/Commentary 三项、低档组有 English/French 两项,顺序有意不同。
音频是确定性正弦样本,Commentary 复用 English 样本,不冒充真实语音或音频语言识别。
版本来源、Apache-2.0 许可及成员哈希见 baselines/hls-sdk-matrix.json;新增版本来自
[npm 固定 1.7.2 元数据](https://registry.npmjs.org/hls.js/1.7.2),
[上游发布记录](https://github.com/video-dev/hls.js/releases) 仅用于核对版本变化。
这里不测试所有中间版本或外部服务器,也没有将 1.7.2 的声明改动等同于类型矩阵全部通过。
实际 TypeScript SDK 声明消费仍只有 PKG-HLS-04 明确记录的 1.5.17 范围。
本子任务暂未完成:一次 Firefox 分组切换后的销毁出现 Target crashed,HLS-CRASH-01
仍待定位。后续完整矩阵和重复通过不能抹去首次失败;详见
[进行中记录](changes/2026-09-12-PKG-HLS-SDK-01-integration.md)。
后续的分组停滞与原生崩溃保持独立风险。固定 SDK 诊断现在可加
`--controller-state` 同时记录控制器、音视频 SourceBuffer 和片段追踪;该观察器
位于 test/helpers/hls-controller-state.js,不进入生产插件。默认不开启,避免把
额外观察导致的时序变化当修复。2026-09-15 的20次原测试通过仍不关闭风险;
成功对照也能短暂出现 ENDED+空媒体缓冲,必须看独立缓冲和后续恢复。
本机 Firefox 编译参数禁用了 crash reporter,不能承诺环境变量能生成 minidump。
随后直接1.5.17两次切组崩溃均在destroy之前;可选观察器向Node复制事件后,
其中一次页面失联仍保留97条事件。此处有最后收到的音视频flush状态,尚无原生堆栈。
详情及后续取证方向见[控制器检查点](changes/2026-09-15-PKG-HLS-SDK-01-controller-state.md)。
## 可选 Windows 原生异常诊断
PKG-HLS-SDK-01 已捕获直接 Hls 1.5.17 的 Firefox DOM Worker 原生异常,
xul.dll+0x3bc4be0、C0000005 读取0x8;尚缺符号堆栈与根因,风险继续 open。
范围隔离、工具版本、重跑命令、监控权限缺口与后续绿色对照的限制见
[原生取证记录](changes/2026-09-15-PKG-HLS-SDK-01-native-exception.md)。