HTML5多媒体错误需分层排查:MediaError.code(1–4)标识用户中止、网络失败、解码错误或格式不支持;HTTP状态码(如404/403/0)定位资源获取问题;MSE/WebSocket错误独立于MediaError;第三方SDK另有错误体系。

HTML5 多媒体错误不是统一报错,而是分散在不同环节:<video>/<audio> 元素加载失败触发 error 事件并暴露 MediaError.code;网络请求失败返回 HTTP 状态码(如 404、500);浏览器能力缺失导致 API 不可用(如 MSE 不支持);第三方 SDK 或混合框架(如 5+)另有独立错误体系。排查必须分层定位,不能只看一个数字。
MediaError.code:视频/音频元素的四类核心错误
MediaError 对象只在 <video> 或 <audio> 触发 error 事件时出现,需为每个媒体元素单独监听:
-
1(MEDIA_ERR_ABORTED):用户主动中止,比如设置
src后立刻调用load()又马上pause(),或页面跳转中断加载 - 2(MEDIA_ERR_NETWORK):最常见,对应 HTTP 网络层失败——404 文件不存在、403 权限拒绝、CORS 跨域拦截、DNS 解析失败、连接超时。此时检查 Network 面板里该资源的响应状态码和响应头
- 3(MEDIA_ERR_DECODE):文件已下载完成,但浏览器解码器无法处理——编码格式不兼容(如 Safari 播放 AV1)、H.265 在不支持的设备上、文件损坏、关键帧丢失
-
4(MEDIA_ERR_SRC_NOT_SUPPORTED):所有
<source>提供的格式均不被当前浏览器识别,例如只提供video/webm却在旧版 IE 中运行,或 MIME 类型声明错误(如写成type="video/mp4"但实际是 MOV)
HTTP 状态码:定位资源获取失败根源
浏览器控制台和 Network 面板中看到的红色请求,其状态码才是第一线索:
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- 404 Not Found:路径错误(大小写敏感、后缀遗漏、相对路径解析错位)、服务器未部署该文件、Nginx/Apache 路由配置漏掉静态资源规则
-
403 Forbidden:服务器拒绝访问——文件权限不足(Linux 上需
chmod 644)、目录禁止列目录、CDN 或防火墙策略拦截 - 0(无状态码):通常表示请求被阻止,常见于广告屏蔽插件拦截了 CDN 域名、CORS 预检失败未触发 error 事件、或跨域资源不可读(静默失败)
-
500/502/503:服务端问题,与 HTML 无关,但若
<script src="/api/video-info">返回 500,会导致后续播放逻辑中断,需查后端日志
MSE 与 WebSocket 错误:RTSP/低延迟流专属问题
基于 Media Source Extensions 的播放器(如 HTML5 RTSP Player)失败时,错误不在 MediaError 里:
立即学习“前端免费学习笔记(深入)”;
- 先确认浏览器支持 MSE:
if (!('MediaSource' in window)),iOS Safari 和 IE 完全不支持,Chrome/Firefox 需确保chrome://flags/#enable-media-source已启用 - WebSocket 连接失败(
ws.onerror)多因代理服务未启动、端口被防火墙封锁、Nginx 反向代理缺少Upgrade和Connection头配置 - 连接成功但无画面:检查代理日志是否收到 RTSP 流,或使用
ffmpeg -i rtsp://... -vframes 1 test.jpg验证源流可拉取
其他常见错误体系补充
非原生 HTML5 多媒体,但常混用的错误场景:
-
5+ API 错误(如 DCloud):错误码为负数,
-1是参数错误,-6表示网络不通,-100是第三方 SDK 内部错误,需结合event.message解析模块前缀(如[oauth微信:-1]) -
canPlayType() 误判:返回空字符串不代表一定不支持,返回
"probably"也不保证能播——它只是浏览器基于 MIME 类型的推测,真实兼容性需实测 -
静默失败:解码错误(code=3)有时不触发
error事件;CORS 拒绝可能只在控制台报错而无事件;autoplay 被浏览器策略阻止时,play()抛 Promise reject,但不会设error


















