2025-11-07 11:37:09 +08:00

4.6 KiB
Raw Blame History

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.42E01EBaseline
      • avc1.640028High Profile Level 4.0
    • 逻辑:若任意代表性配置返回 supported: true,则判定为“支持”。若全部返回 supported: false 或抛错,则“未支持/未知”。
  • HEVC 探测建议(平台相关):
    • 尝试 hvc1hev1 两种品牌。
    • 代表性字符串(示例):
      • hvc1.1.6.L93.B0
      • hev1.1.6.L93.B0
    • 不同实现对 descriptioncodec private data与 profile-level 的要求可能不同。策略:从简到繁,先试纯 codec,再试带 profile-level如上面的示例
  • 安全上下文:
    • WebCodecs 在非安全上下文可能不可用;!isSecureContext 时直接给出提示,并将 AVC/HEVC 标记为 unknown
  • 错误处理:
    • 统一捕获异常与拒绝,记录在详情中,页面通过 Alert 简述。

判定调用示例(伪代码,仅文档说明)

await VideoDecoder.isConfigSupported({
  codec: 'hvc1.1.6.L93.B0',
  hardwareAcceleration: 'prefer-hardware',
});

6. 数据结构与接口(由 utils/codecs 对外暴露)

  • 类型:
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;
  };
}
  • 接口:
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 完成时间)
    • 用户使用“重新检测”与“复制详情”的频次(可选)