R3.07.6media decode fallback chain设计

媒体降级链需覆盖解码失败与格式不支持

别名: picture 降级 · 解码失败 · 格式不支持 · source 回退

概念解释

新格式更小,但不保证每台设备都能解。降级链要覆盖两类失败:格式根本不支持,以及支持却解码失败(损坏、内存不足、硬件解码器拒绝)。只写“优先 AVIF、否则 JPEG”是格式偏好;真正的链还要在 decode 抛错、error 事件、超时之后仍落到一张能看见的图或静帧。链的终点必须是用户仍能完成任务,而不是裂图图标。

机制

<picture> / <source> 按类型与媒体查询挑第一个引擎声称支持的候选;这只处理“不支持”。运行时解码是另一步:类型匹配后仍可能因码流损坏、分辨率超过预算、或软件解码 OOM 而失败。失败走 error,若没有下一个候选,槽就空着。完整的链是:首选编码 → 次选编码 → 普遍可解的基线(JPEG / H.264 静帧)→ 非媒体的替代(说明文字、链接、重试)。视频还要在编码不支持时落到海报,而不是黑框。

“声称支持”和“这次能解”不是同一回事。硬件解码器对色彩空间、层级、alpha 的子集更窄;软件路径更慢也更易在低内存设备上被杀。链必须在失败时换路径,而不是只在能力探测为真时选一次。

边界

单一格式且受众运行时完全受控(只发内部包、只支持一种解码器)可以没有长链,但仍要处理文件损坏。装饰性背景失败可以静默空着,不该用一张抢眼的裂图。DRM 与加密媒体的失败是授权问题,换格式解决不了。用户关掉图片加载时,链的终点应是替代文本,不是下一张同样会被拦的图。

怎么落地

  • <picture> 列出首选到基线的类型;视频用多 <source>,最后一张海报保证可见。
  • 监听 error / 解码拒绝,切到链上下一个 URL,而不是停在裂图;基线仍失败则换文本替代并提供打开原文件的途径。
  • 能力探测只用于排序候选,不用于跳过错误处理——探测为真仍要能承接失败。
  • 验证:人为改成不支持的类型、截断文件、在低内存设备上开超大分辨率,槽内都应出现基线图或可读替代,而不能是永久裂图。每种失败各走一遍链。

延伸

  • 同组R3.07.1 尺寸与格式需按使用场景生成 · R3.07.2 未声明尺寸会造成布局跳动 · R3.07.3 自动播放消耗流量与注意力 · R3.07.4 视口外的媒体延后加载,视口内的优先加载 · R3.07.5 占位与最终图的主色接近可减少突兀
  • 相邻R3.16 低端设备与降级策略 · J2.05 装饰性图像
  • 站内检索decode failure · picture element · codec fallback

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/R3.07.6