video标签需用相对或绝对URL路径,禁用file://协议;应部署于本地服务器或转base64;src须为同目录/子目录相对路径,推荐H.264+AAC编码、小写短横命名,并配置正确MIME类型。
浏览器出于安全限制,直接双击打开 HTML 文件(file:// 协议)时, 标签无法加载本地视频文件,会静默失败或报 DOMException: The element has no supported sources。这不是写法错误,而是协议限制。
解决方法只有两个:
python3 -m http.server 8000 或 VS Code Live Server 插件)假设项目结构如下:
my-page/
├── index.html
└── videos/
└── demo.mp4
在 index.html 中这样写:
注意点:
src 是相对路径,不是 ./videos/demo.mp4 也不是 file:///.../demo.mp4
type 属性虽可省略,但显式声明 type="video/mp4" 能避免某些浏览器反复探测格式intro-video.mp4
MP4 容器本身没问题,但编码格式可能不被浏览器支持。Chrome/Firefox/Safari 对 H.264 + AAC 组合兼容最好,而 H.265(HEVC)、AV1、VP9 编码的 MP4 在部分浏览器中会黑屏无报错。
验证和转换建议:
ffprobe demo.mp4 查看编码:Stream #0:0(und): Video: h264 (Main) 是安全的;hevc 或 av1 则需转码ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac output.mp4
moov 原子位置敏感,需确保它在文件开头(加 -movflags +faststart)如果加了 autoplay,现代浏览器基本都会拦截,除非同时满足:
muted 属性存在()play() 才可能成功单独写 autoplay 几乎无效,尤其在 iOS 上。更稳妥的做法是:
实际部署时,最常被忽略的是服务器 MIME 类型配置——如果用 Nginx/Apache,要确保
.mp4 返回 video/mp4,否则视频加载会卡在“pending”。本地起的 Python HTTP 服务默认支持,但自己搭的静态服务容易漏掉这点。