# PRD:WebCodecs AVC/HEVC 判定页面 ## 1. 背景与目标 - 背景:不同浏览器/平台对 WebCodecs 的支持不一致,尤其 HEVC(H.265) 支持高度依赖平台与浏览器实现。开发者需要一个简单页面来判定当前环境是否支持 WebCodecs、AVC(H.264) 与 HEVC(H.265)。 - 目标:构建一个单页应用,使用 WebCodecs 相关 API(主要是 `VideoDecoder.isConfigSupported`)进行判定,给出清晰的结果与可追溯的详情。 ## 2. 范围与非目标 - 范围: - 判定 WebCodecs 可用性 - 判定 AVC(H.264) 解码支持 - 判定 HEVC(H.265) 解码支持 - 展示判定详情(环境、输入配置、返回信息、错误) - 非目标: - 不进行视频解码、编码或渲染 - 不做登录、权限、国际化、路由、多页 ## 3. 用户场景与价值 - 前端/视频开发者打开页面即可得知当前环境是否能安全地依赖 WebCodecs 的 AVC/HEVC 解码能力,用于后续策略选择(如降级到 H.264、走 MSE 或 WebAssembly 等)。 ## 4. 功能描述 - 首屏自动判定并展示三类状态:WebCodecs、AVC、HEVC。 - 提供“重新检测”按钮,重新执行全部判定。 - 在详情中展示:UA、安全上下文(`isSecureContext`)、每次 `isConfigSupported` 的输入/输出、错误信息。 ## 5. 技术方案与实现策略 - 判定基于 WebCodecs: - WebCodecs 可用判定:`typeof window.VideoDecoder !== 'undefined'` - 统一使用 `VideoDecoder.isConfigSupported(config)` 来探测是否支持某种编码配置。 - AVC 探测建议: - 常见且广泛支持的配置字符串(示例): - `avc1.42E01E`(Baseline) - `avc1.640028`(High Profile Level 4.0) - 逻辑:若任意代表性配置返回 `supported: true`,则判定为“支持”。若全部返回 `supported: false` 或抛错,则“未支持/未知”。 - HEVC 探测建议(平台相关): - 尝试 `hvc1` 与 `hev1` 两种品牌。 - 代表性字符串(示例): - `hvc1.1.6.L93.B0` - `hev1.1.6.L93.B0` - 不同实现对 `description`(codec private data)与 profile-level 的要求可能不同。策略:从简到繁,先试纯 `codec`,再试带 profile-level(如上面的示例)。 - 安全上下文: - WebCodecs 在非安全上下文可能不可用;`!isSecureContext` 时直接给出提示,并将 AVC/HEVC 标记为 `unknown`。 - 错误处理: - 统一捕获异常与拒绝,记录在详情中,页面通过 Alert 简述。 ### 判定调用示例(伪代码,仅文档说明) ```ts await VideoDecoder.isConfigSupported({ codec: 'hvc1.1.6.L93.B0', hardwareAcceleration: 'prefer-hardware', }); ``` ## 6. 数据结构与接口(由 `utils/codecs` 对外暴露) - 类型: ```ts export type CodecStatus = 'supported' | 'unsupported' | 'unknown'; export interface CodecSupport { webCodecs: boolean; avc: CodecStatus; hevc: CodecStatus; details: { env: { userAgent: string; isSecureContext: boolean; hasVideoDecoder: boolean; }; checks: Array<{ codec: string; // 传入的 codec 字符串 result?: any; // isConfigSupported 的返回(裁剪) ok: boolean; // 是否成功/支持 error?: string; }>; errors?: string[]; timestamp: number; }; } ``` - 接口: ```ts export async function detectAll(): Promise; export async function checkAVC(): Promise; export async function checkHEVC(): Promise; ``` ## 7. 验收标准 - 在支持 WebCodecs 且支持 HEVC 的浏览器(如部分 Safari/iOS/macOS)显示: - WebCodecs:可用 - AVC:支持(大概率) - HEVC:支持 - 在支持 WebCodecs 但不支持 HEVC 的浏览器(如多数默认配置的 Chrome/Windows): - WebCodecs:可用 - AVC:支持 - HEVC:不支持 - 在不支持 WebCodecs 的浏览器(如部分 Firefox): - WebCodecs:不可用(Alert 提示) - AVC/HEVC:未知 - 详情区包含环境、检查输入/输出、错误信息与时间戳。 ## 8. 兼容性与风险 - HEVC 支持强平台依赖,可能需要操作系统编解码器或浏览器实验开关;结果可能随版本变化。 - 字符串语法(profile-level)在不同实现中解析差异,需在详情中透明记录。 - 非安全上下文导致 WebCodecs 不可用。 ## 9. 依赖与约束 - 依赖:现代浏览器、HTTPS 环境 - 技术栈:React + Tailwind + shadcn/ui + TypeScript + Vite ## 10. 发布与度量 - 发布:静态资源即可部署 - 度量: - 首屏交互完成时间(粗略) - 判定耗时(检测 Promise 完成时间) - 用户使用“重新检测”与“复制详情”的频次(可选)