本文档分三章:一、测试矩阵与用例(测什么);二、通过用例描述(哪些过了);三、问题用例与异常现象(哪些有问题、现象是什么)。
| ID | 协议 / 容器 | reader 路径 | 关联样本 |
|---|---|---|---|
| P1 | local file MP4(H.264 + AAC) | ffmpeg_reader | M1 / M3 / M4 / M9 |
| P2 | HTTPS progressive MP4 | http_progressive_reader(含 TLS) | M1–M11 + M12~M18 |
| P3 | HLS(VOD + 时移已录完段,TS 分片) | hls_reader | M19~M23(M22 暂无) |
不测:FLV / RTMP / RTSP / HTTP-FLV(直播范畴)、纯 HTTP 明文(业务侧全站 HTTPS)。
| 组 | 风险 | 场景 | 触发 | 关键验证点 |
|---|---|---|---|---|
| L1 资源 | 🟢 | S1 open / S2 close | prepare(url) / close() | 状态序列合法、onMediaInfoReady 阈值、含自然 EOS→ENDED→close |
| L2 播控 | 🟢 | S3 play / S4 pause | start() / pause() | READY→PLAYING + PAUSED→PLAYING;暂停后位置不增长 |
| L3 终止 | 🟢 | S5 stop | stop()(三态触发) | 任意非 IDLE → IDLE,不跳过中间态 |
| L4 seek | 🟡 | S6 前向 / S7 后向 | seek(pos±30s) | 目标 ±100ms;无音频持续丢弃 / 视频无 late drop(I5-A02 基线) |
| L4 seek | 🔴 | S8 高频 | 1s 内 5 次 | 同上;竞态 / callback 队列错位 |
| L5 流切换 | 🔴 | S9 switch_to | switchToUrl(new_url) | 新流自动 start、旧 config 保留;token/generation 失效(fef0764/a42bcda 修复区) |
| L5 流切换 | 🟡 | S10 reload | reload() | 起播定位清空、内部状态重置 |
| L6 循环 | 🟡 | S11 loop | setLoop(true) 播至 EOS | EOS→seek(0)→继续 PLAYING,至少 3 轮无异常 |
基础矩阵 = 协议 × 场景 = 33 格;五端展开 165 cell。
编号约定:U* UI 行为 / LC* 应用生命周期 / N* 网络中断 / E* 错误注入 / D* 长播稳定性 / NET* 倍速与弱网扩展。
| ID | 风险 | 场景 | 关键判定 |
|---|---|---|---|
| U1 | 🟡 | 首帧预渲染 | 显示首帧 + 停在暂停态 + 播放后丝滑、首帧无变动 |
| U2 | 🟢 | 全屏 / 取消全屏 | 切换无重载、无黑边 / 拉伸、音视频连续 |
| U3 | 🟡 | 横竖屏切换 | 自适应、无重载、控件重排 |
| U4 / U5 | 🟢 | seek 到末尾 / 初始 | 正确跳转、自然 EOS 或从头播 |
| U6 / U7 | 🟢 | seeking / switching 状态显示 | UI 显示对应状态且不卡住 |
| ID | 风险 | 场景 | 关键判定 |
|---|---|---|---|
| LC1 | 🟢 | 秒压后台 | 恢复后正常播放、无崩溃 |
| LC2 | 🔴 | 长压后台 10min | 恢复后正常播放、位置 / 倍速 / 音量 config 保留 |
| LC3 | 🟡 | 锁屏解锁 1min | 恢复后正常播放、UI 状态正确 |
| ID | 风险 | 场景 | 关键判定 |
|---|---|---|---|
| N1 | 🔴 | 断网恢复 | 重连显示 reconnecting、恢复后自动续播、续播首帧防花屏 |
| N2 | 🟢 | 断网 seek 恢复 | 恢复后在 seek 目标位置续播 |
| ID | 风险 | 子类 | 场景 | 关键判定 |
|---|---|---|---|---|
| NET1 | 🟡 | 倍速 | 单档 2x / 1.5x / 0.75x / 0.5x | 速度符合预期、无音画不同步、变速无顿挫 |
| NET2 | 🔴 | 倍速 | 倍速时 seek | 正确跳转、继续保持倍速(经典坑:被 seek 重置回 1.0x) |
| NET3 | 🟢 | 倍速 | 倍速 + 高频 seek | 稳定、流畅、无崩溃 |
| NET4 | 🟢 | 倍速 | 倍速 + 压后台保留 | 返回后依旧倍速(config 保留) |
| NET5 | 🔴 | 弱网 | 弱网首次起播(限速 200kbps) | 能缓冲播放、不卡死 BUFFERING > 30s |
| NET6 | 🟡 | 弱网 | 网络链路切换 Wi-Fi ↔ 4G/5G | 丝滑、无卡顿、IP 切换不破坏 HTTPS session |
| NET7 | 🟢 | 弱网 | 弱网 + seek 恢复 | 允许长缓冲,不卡 > 30s,最终回到 PLAYING |
| ID | 风险 | 场景 | 关键判定 |
|---|---|---|---|
| E1 | 🟢 | 错误 URL | 无法播放、UI 不崩、错误提示友好 |
| E2 | 🟢 | 切换错误 URL | URL2 切换失败、URL1 继续 |
| E3 | 🟢 | 切换空 URL | 切换被拒、URL1 继续 |
| E4 | 🔴 | 不解密播加密 | UI 正常、无法播放、不崩、不花屏 |
| ID | 风险 | 场景 | 关键判定 |
|---|---|---|---|
| D1 | 🟡 | 20 分钟连播 | 末段音画同步无漂移、UI 无崩、内存稳定 |
| profile 类别 | 特征 | 验证方法 | 通过判据 |
|---|---|---|---|
weak1_high / weak1_mid / weak1_low | 带宽 + 丢包 | curl 测下载速度 | 实测速度 < profile 带宽上限的 1.5× |
weak2_jitter_low / weak2_jitter_high | 固定 delay | ping 测 RTT | 实测 RTT ≥ 预期 jitter 的 80%(low ≥160ms / high ≥400ms) |
weak2_sudden | 1Mbps 基线 + 周期断网 | curl 测基线 + 等首次断网 | 基线带宽受限,且 sudden-loop.log 出现至少一条 sudden-down |
NET5~NET7 跑前先用对应 profile 验证方法确认环境真到位(防透明代理 / 网关绕过限速误判)。工具链复用 network_test_matrix.md §2.2。
样本 ID(M)= 媒体素材编号,与协议(P)/ 场景(S*)正交:一个用例 = 协议 × 场景 × 样本。下表逐 ID 给出含义(源:vod_test_matrix.md §样本表 + vod_test_overview.md §2.3.1 / §2.3.2)。
业务侧基础(M1–M11,mp4)
| ID | 类别 | 含义 | 分辨率 | B 帧 | 加密 | 地址 |
|---|---|---|---|---|---|---|
| M1 | A | 音画同步测试视频 1(主跑样本) | 720p | 有 | 否 | https://video.aicastech.com/vod/avsync.mp4 |
| M2 | A | 音画同步测试视频 2 | 720p | 有 | 否 | https://video.aicastech.com/vod/avsync2.mp4 ⚠️ 原表链接 typo 指向 avsync.mp4,待确认 |
| M3 | B | 多 B 帧(seek 最易暴露缺陷) | 1080p | 多 | 否 | https://video.aicastech.com/vod/MBFrames.mp4 |
| M4 | B | 无 B 帧(对照 M3) | 1080p | 无 | 否 | https://video.aicastech.com/vod/NoBFrame.mp4 |
| M5 | B | 多分辨率 + 多帧率 | 多 | – | 否 | https://video.aicastech.com/kun/mr_mf_unencrypt.mp4 |
| M6 | C | 多分辨率 + 多帧率(加密,对照 M5) | 多 | – | 是 | https://video.aicastech.com/kun/mr_mf_encrypt.mp4 |
| M7 | C | 单分辨率 + 单帧率(加密) | 单 | – | 是 | https://video.aicastech.com/kun/sr_sf_encrypt.mp4 |
| M8 | A | 音乐 MV | 720p | 有 | 否 | https://video.aicastech.com/vod/mv_00.mp4 |
| M9 | A | 足球比赛长片段 | 1080p | 无 | 否 | https://storage.googleapis.com/mp-f3-assets/recordings/2026/05/11/4357106_20260511_202006.mp4 |
| M10 | D | 仅视频、无音频 | – | – | 是 | https://video.aicastech.com/kun/only_video_encrypt.mp4 |
| M11 | D | 仅音频、无视频 | – | – | 是 | https://video.aicastech.com/kun/only_audio_encrypt.mp4 |
STS 录制扩展(M12–M18,mp4) — 源:STS 录制后端,复用 kun/* 路径
| ID | 类别 | 含义 | 分辨率 × 帧率 | 加密 | 大小 | 地址 |
|---|---|---|---|---|---|---|
| M12 | B | STS 未加密多×多 | 多 × 多 | 否 | 300 MB | https://video.aicastech.com/kun/mr_mf_unencrypt.mp4 |
| M13 | F | STS 加密长样本(单帧率解码路径) | 单 × 单 | 是 | 1.91 GB | https://video.aicastech.com/kun/sr_sf_encrypt.mp4 |
| M14 | F | STS 加密长样本(多帧率解码路径) | 单 × 多 | 是 | 1.99 GB | https://video.aicastech.com/kun/sr_mf_encrypt.mp4 |
| M15 | C | STS 加密多分辨率 | 多 × 单 | 是 | 585 MB | https://video.aicastech.com/kun/mr_sf_encrypt.mp4 |
| M16 | C | STS 加密多分辨率多帧率 | 多 × 多 | 是 | 710 MB | https://video.aicastech.com/kun/mr_mf_encrypt.mp4 |
| M17 | D | STS 加密仅视频(边界) | 多 × – | 是 | – | https://video.aicastech.com/kun/only_video_encrypt.mp4 |
| M18 | D | STS 加密仅音频(边界) | – | 是 | – | https://video.aicastech.com/kun/only_audio_encrypt.mp4 |
STS 时移 HLS 扩展(M19–M23,TS 分片)
| ID | 类别 | 含义 | 分辨率 × 帧率 | 加密 | 地址 |
|---|---|---|---|---|---|
| M19 | B | HLS 未加密多×多 | 多 × 多 | 否 | https://video.aicastech.com/timeshift/4459572/playlist.m3u8 |
| M20 | C | HLS 加密单×单 | 单 × 单 | 是 | https://video.aicastech.com/timeshift/4426349/playlist.m3u8 |
| M21 | C | HLS 加密单×多 | 单 × 多 | 是 | https://video.aicastech.com/timeshift/3890419/playlist.m3u8(URL 路径与比赛 ID 不一致,以 URL 为准) |
| M22 | C | HLS 加密多×单(暂无源,占位) | 多 × 单 | 是 | — |
| M23 | C/B | HLS 加密多×多(S9 × M23 = P0 高风险) | 多 × 多 | 是 | https://video.aicastech.com/timeshift/4393495/playlist.m3u8 |
按类别归并:A 音画同步基线(M1/M2/M8/M9)· B 编码特性(M3/M4/M5/M12/M19)· C 加密路径(M6/M7/M15/M16/M20/M21/M23)· D 边界轨道(M10/M11/M17/M18)· E 弱网组合(A/B 类样本 × 6 个弱网 profile,非新样本)· F 长稳定性(M13/M14)。
加密样本走 --decrypt=v2:<HEX64> + crypt_version;跨源需白名单(kun/* = 7.0.10241430,recordings/* = 026530e)。M22 暂无源(保留编号占位);M10/M11 业务侧未提供。另文中出现的 M-HLS(非加密 HLS 主跑)/ M-ext-enc(跨源加密"足球 2")/ DEC-HLS(加密 HLS)为移动端证据里的别名,对应上表 HLS 与加密类样本。
口径:桌面 / macOS 走 scenario DSL 自动采集(report.json+events.ndjson+ 自动 verdict);iOS 走 Xcode 手动 Run + 人眼观察(无客观指标)。各端通过项以最大 NNN 的 verdict 为准。
P1/P2/P3 × S1–S11 全 PASS,error_count 全 0,first_frame_ms 全端 ~100ms。
| proto | 通过场景 | 备注 |
|---|---|---|
| P1 local | S1–S11 全 PASS | local indexed MP4 seek ~100ms;S11 loop 30s 样本 ×2 轮事件计数 Win=Lin(2 eos + 2 seek pair + 3 playing) |
| P2 HTTPS MP4 | S1–S11 全 PASS | S8 高频 seek 调超时到 45s 后通过;seek p50 Win ~2.6s / Lin ~3.3s(Pass*) |
| P3 HLS-VOD | S1–S11 全 PASS | S8 段边界 seek ~2.1–2.4s(Pass*) |
证据:evidence/windows/5e1c9a4/、evidence/linux/5e1c9a4/。
长稳定性(D1):Windows 用 M13(加密长样本 1.91GB)GUI 连播 ~58.8min、M14(1.99GB)headless ~59.3min,全程无崩溃、跑满时长——这一项已覆盖(长样本不缺)。但加密长连播视频丢帧率 ~80%、内存曲线采集失败,属问题项(见 §3.1 VP06)。证据 evidence/windows/5e1c9a4/long_stability/。
scenario DSL 自动采集,与桌面同口径,error_count 全 0,first_frame_ms ~100–104ms。
| Phase | 内容 | 结果 |
|---|---|---|
| A | 33-cell 基线 P1/P2/P3 × S1–S11 | 33/33 PASS |
| B | 4 个 S9 多组合(M1→M3 / M1→M-HLS / M-HLS 自切 / M-HLS→M1) | 4/4 PASS |
| C | 24 个加密 case(M-ext-enc + M7/M14/M15/M16/M17/M18 + M-HLS-enc;含 S9×M15/M16/M-HLS-enc P0 组合) | 24/24 PASS |
特记:M18 audio-only first_frame_ms=-1 为预期;HLS S8 seek p95 >500ms 标 Pass*。证据:evidence/macos/e093f7b/。
demo 修复 92fc074(load 幂等 + quit/set_loop)后跑通的项:
| 协议 / 样本 | 通过场景 | 备注 |
|---|---|---|
| P3 HLS(M-HLS 非加密) | S6(前向 seek)/ S7(后向 seek)/ S9(switch_to)/ S10(reload)/ S11(loop) | verdict=pass、quit_fired=yes;⚠️ 但 first_frame=no(见 §3,黑屏问题) |
| 加密 HLS(DEC-HLS) | S3(play)/ S8(高频 seek)/ S9(switch_to)/ S11(loop) | verdict=pass,first_frame=yes(加密 HLS 有首帧) |
| 错误注入 E 系列 | E1a(错误 URL)/ E2(切换错误 URL)/ E3(切换空 URL)/ E4-hls(不解密播加密 HLS) | 错误路径符合预期 |
| VP-fix 验证(P2/P3) | P2(HTTPS MP4)S3/S6/S7/S9/S10/S11 + P3(HLS)S3/S6/S7/S9/S10 | logcat 留证,证明 DSL 解阻(06-08) |
证据:evidence/android/5e1c9a4/、evidence/android/a1538bd-and-vp-fix/。注:P3 非加密虽 verdict=pass,但无首帧出图,属"pass 但黑屏",实际不可用(§3 VP-AND06)。
| 协议 / 样本 | 正常场景 | 观察 |
|---|---|---|
| P1 本地 MBFrames | S1(open)/ S2(close)/ S4(pause)/ S5(stop)/ S6(前向 seek)/ S7(后向 seek)/ S10(reload)/ S11(loop) | 正常播放、seek 位置正确、音画同步 |
| P2 非加密 M1 | S1(open)/ S2(close)/ S4(pause)/ S5(stop)/ S6(前向 seek)/ S7(后向 seek)/ S8(高频 seek)/ S10(reload)/ S11(loop) | 正常播放 |
| E4 不解密播加密 | E4(不解密播加密) | UI 正常、画面黑屏、不崩溃(符合 P0 预期) |
| NET1 单档倍速 | 0.5× / 0.75× | 音画同步、无爆破音 |
证据:evidence/ios/e093f7b/(observation.md 人眼记录)。iOS 其余场景见第三章。
| 端 | 通过口径 | 数量 |
|---|---|---|
| Windows 11 | scenario DSL 自动 verdict | 33/33 PASS |
| Linux Ubuntu 26.04 | 同上 | 33/33 PASS |
| macOS 26.3.1 | 同上 | 61/61 PASS |
| Android Xiaomi | verdict=pass(P3 非加密含黑屏) | P1/P2 基础场景为主 |
| iOS iPhone 16e | 人眼观察"正常" | P1/P2 基础场景为主 |
编号沿用 vod-problem-set.md:通用 / 桌面 VP01–06、Android VP-AND01–07、iOS VP-IOS01–07、macOS VP-MAC01。| 编号 | 用例 | 异常现象 | 状态 |
|---|---|---|---|
| VP01(S8 网络源超时偏紧) | S8(高频 seek)·P2(HTTPS MP4)/P3(HLS)网络源 | 默认 scenario-timeout 20s 不足,首跑 verdict=timeout | 已规避(调 45s) |
| VP02(P2-S11 跨端 displayed 差异) | S11(loop)·P2(HTTPS MP4)·Win vs Linux | video_displayed Win 1814 / Lin 404,相差 4.5×(不影响 verdict) | 待定(疑 Wayland render_callback 节流) |
| VP03(长样本长稳定性,原"缺样本"作废) | D1(20 分钟连播 / 长稳定性)·M13(加密单分辨率单帧率 1.91GB)/ M14(加密单分辨率多帧率 1.99GB) | 长样本已测:M13 GUI 连播 ~58.8min(29 张截图)、M14 headless ~19.3min,均无崩溃 | ✅ 已覆盖 |
| VP06(加密长连播丢帧 ~80% + 内存采集缺失) | D1(长稳定性)·M13 / M14 加密长样本 | M13 丢帧率 79.90%(55203/69086)、M14 ~79.8%(drop 17290/D 4376);音频正常、不崩溃;memory_timeline.csv 仅表头(内存采集失败) | 待评估 |
| VP04(WSL2 S8 崩溃无复现) | S8(高频 seek)·Linux WSL2 | issue 描述的 WSL2 高频 seek 崩溃,本机无 WSL2 环境未复现 | 缺环境 |
| VP05(seek_latency 测量失真) | S6(前向 seek)/S7(后向 seek)/S8(高频 seek) | scenario_session.ts_ms 是 drain-time,seek_latency 派生恒为 0(测量失真) | 已规避(Pass* + interval 代理) |
已修复(commit 92fc074,曾阻塞自动化):
| 编号 | 用例 | 原异常现象 | 状态 |
|---|---|---|---|
| VP-AND01(首位 load 触发 invalid_state) | DSL 首位 load(各场景启动) | 与 scheduleInitialAutoLoad 重复触发,第二次 load 被拒 invalid_state,后续 action 中断 | ✅ 已修复(load 幂等) |
| VP-AND03(不支持 quit action) | DSL 末尾 quit(退出语义) | demo 不支持 quit action,被静默忽略 | ✅ 已修复(加 quit→finish) |
| VP-AND04(不支持 set_loop action) | S11(loop)的 set_loop | demo 不支持 set_loop action,S11(loop)跑不通 | ✅ 已修复(加 set_loop) |
待处理:
| 编号 | 用例 | 异常现象 | 状态 |
|---|---|---|---|
| VP-AND05(postDelayed schedule 模型差异) | 网络源场景 DSL 鲁棒性 | postDelayed 静态 schedule(无 wait_for),HTTPS 抖动下 wait:N 盲等不可靠 | 待评估 |
| VP-AND06(P3 HLS 无首帧黑屏) | P3(HLS · M-HLS 非加密)S6(前向 seek)/S7(后向 seek)/S8(高频 seek)/S9(switch_to)/S10(reload)/S11(loop) | 6 个 P3 cell 全部 first_frame=no(黑屏),verdict 却 pass;同机加密 HLS 反而有首帧 | 待修 P0 |
| VP-AND07(加密 HLS seek 崩溃) | 加密 HLS(DEC-HLS)S6(前向 seek)/S7(后向 seek) | 2 case 崩溃(verdict=crash) | 待修 P0 |
| 编号 | 用例 | 异常现象 | 状态 |
|---|---|---|---|
| VP-IOS01(P3 HLS 渲染全失败黑屏) | P3(HLS)全部场景(14 case) | 声音正常、画面全程黑屏;S7(后向 seek)/S8(高频 seek)多次 seek 后崩溃 | 待修 P0 |
| VP-IOS02(加密样本起播卡顿) | 加密样本 M16(加密多分辨率多帧率 mp4)/ M-ext-enc(跨源加密 足球2)(7 case) | 起播后 6–40s 严重卡顿;M16 二次 seek 卡死 loading | 待修 P0 |
| VP-IOS03(加密 switchURL 后黑屏) | S9(switch_to)加密(S9-002 / S9-003) | 切换后画面黑屏不再播放,新流不呈现 | 待修 P0 |
| VP-IOS04(断网不自动续播) | N1(断网恢复) | 恢复网络后不自动续播,start 无效,须手动点"载入" | 待修 |
| VP-IOS05(后台画面冻结) | LC2(长压后台) | 后台 2s 即画面冻结(音频继续),pause/start 不恢复,仅 seek 恢复 | 待修 |
| VP-IOS06(EDGE 弱网首播失败) | NET5(弱网首播)·EDGE | EDGE preset 5min 加载不出(LTE/DSL 可播) | 待评估 |
| VP-IOS07(倍速 UI 误显 / 输入爆破音) | NET2(倍速时 seek)/ S9(switch_to)输入 URL | 倍速保持但 UI 误显示 1×;输入 URL 时音频爆破音 | demo 层(不涉 SDK) |
证据逐 case 见 evidence/ios/e093f7b/scenarios/<case>/observation.md。
| 编号 | 用例 | 异常现象 | 状态 |
|---|---|---|---|
| VP-MAC01(跨源加密 crypt_version 误判) | 跨源加密 M-ext-enc(跨源加密 足球2,crypt_version=026530e) | 首跑 unsupported crypt_version → exit=3;误判非加密去 decrypt 后 verdict=pass 但丢帧 69%;加白名单后正确解密 | 已规避 |
教训:headless verdict=pass ≠ 内容播放正常;dropped > 50% 必须人眼 / ffmpeg 复核。
first_frame=no 仍判 pass、macOS 丢帧 69% 仍判 pass,说明 verdict 未把"首帧 / 丢帧比例"纳入判定。建议给 verdict 增加 first_frame 必检 + dropped_ratio 阈值。| 项 | 状态 |
|---|---|
| 桌面 Win / Linux 33+33 | ✅ 完整 PASS |
| macOS 61 | ✅ 完整 PASS |
| 长稳定性(D1)长样本 | ✅ 已覆盖(M13 ~59min / M14 ~19min,不崩溃);遗留 VP06 |
| VP06(加密长连播丢帧 ~80% + 内存采集缺失) | ⏳ 人眼复核截图 + 修内存采集重跑 + 补非加密长样本对照 |
| Android demo 自动化阻塞 | ✅ 已解除(92fc074) |
| Android 完整 66 cell | |
| iOS 客观指标 | ⏳ 待 scenario DSL 移植 Swift demo |
| VP-AND06(Android P3 HLS 黑屏)+ VP-IOS01(iOS P3 HLS 黑屏)HLS 出图专项 | ⏳ 建议合并起 issue |
| VP-AND07(加密 HLS seek 崩溃)/ VP-IOS02(加密起播卡顿)/ VP-IOS03(加密切流黑屏)移动端加密缺陷 | ⏳ 联合排查 |
| verdict 增加 first_frame / dropped_ratio 判定 | ⏳ 待评估开 issue |
本文档由 AI 起草于 2026-06-10,基于五端实证证据与 problem-set;草稿状态,待 ryan_code review + 定稿。
—— 评论区 ——