2025-11-12 14:49:07 +08:00

114 lines
4.6 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.

# PRDWebCodecs 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<CodecSupport>;
export async function checkAVC(): Promise<CodecStatus>;
export async function checkHEVC(): Promise<CodecStatus>;
```
## 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 完成时间)
- 用户使用“重新检测”与“复制详情”的频次(可选)