视频黑屏或报错“Failed to load resource”大概率是资源不可达、格式不被识别或浏览器策略拦截;需依次排查file://协议限制、路径大小写、controls与type属性缺失、编码兼容性、autoplay策略、移动端playsinline及MIME类型。

视频标签写了、src也填了,但页面上就是黑屏或报错“Failed to load resource”,大概率不是代码写错了,而是资源不可达、格式不被识别,或者浏览器策略直接拦截了——先确认这三点,90%的问题当场定位。
video.src 404 或控制台报 net::ERR_FILE_NOT_FOUND
这是最常被忽略的起点。双击打开本地 index.html 时,Chrome/Firefox/Safari 会拒绝加载 file:// 协议下的视频文件,哪怕路径完全正确。
- 直接在浏览器地址栏粘贴
src的完整路径(比如file:///Users/xxx/video.mp4),看是否能下载;如果打不开,说明是协议限制,不是文件问题 - 改用
python3 -m http.server 8000启一个本地 HTTP 服务,然后访问http://localhost:8000/index.html - VS Code 的 Live Server 插件有时会重写响应头或注入脚本,导致
video/mp4被当成文本返回,建议优先用原生命令行起服务 - 检查路径大小写:Linux/macOS 服务器对
Video.MP4和video.mp4是区分的
video 标签有画面但点不了播放按钮
常见于漏掉 controls 属性,或虽写了 controls 却因格式不支持而静默失败。
- 必须显式写
<video controls>,自闭合写法<video controls />不合法,会导致控件不渲染 - 即使有
controls,若所有<source>都不被当前浏览器支持,按钮点击后仍无反应——此时 Network 面板里视频请求状态可能是 200,但控制台会抛MediaError - 务必为每个
<source>补全type属性:<source src="v.mp4" type="video/mp4">;只写src不写type,Safari 和旧版 Firefox 可能跳过该源 - MP4 文件实际编码未必是 H.264:用
ffprobe video.mp4看codec_name,HEVC(H.265)或 AV1 在 iOS 和部分 Android 上不被原生支持
autoplay 不生效,且控制台报 NotAllowedError
这不是 bug,是 Chrome ≥66、Firefox ≥66、Safari ≥11 的强制策略:未静音 + 无用户交互 = 自动播放被拒。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
立即学习“前端免费学习笔记(深入)”;
- 唯一轻量解法是加
muted:<video autoplay muted controls>—— 几乎所有主流浏览器都允许静音自动播放 - 若必须带声,不能在
DOMContentLoaded或load事件里调play(),得等真实用户操作后触发,例如:
document.addEventListener('click', () => {
document.querySelector('video').play().catch(e => console.warn('play() rejected:', e));
});
play() 返回 Promise,拒绝时抛 NotAllowedError 或 AbortError,不 catch 就会中断后续 JS 执行playsinline 和 webkit-playsinline,否则即使 play() 成功,也会强制跳转原生播放器移动端白屏、手势失效或无法全屏
iOS Safari 对 <video> 的限制远比桌面严格,很多行为在桌面正常,一到 iPhone 就崩。
- 必须加
playsinline,否则 iOS 10+ 默认全屏播放,且无法内联控制进度条、音量等 - 父容器若设置了
touch-action: none或overflow: hidden,可能禁用双指缩放、滑动拖拽等手势,视频区域变“死区” - 避免用
transform或will-change对<video>做动画,iOS 上容易触发渲染异常导致黑屏 - 服务器必须返回正确的 MIME 类型:
.mp4 → video/mp4,.webm → video/webm;返回application/octet-stream会被 Safari 拒绝加载
真正卡住人的往往不是某一行代码,而是多个条件叠加:比如你用了 HEVC 编码的 MP4 + 没加 type + 直接双击打开 HTML + 还想 autoplay 带声——四个坑叠在一起,查起来就像在迷宫里找出口。每次只改一个变量,用 Network 和 Console 验证,比反复重写整个 <video> 有效得多。


















