video 标签黑屏主因是编码格式不匹配、服务器 Content-Type 错误、移动端自动播放限制及缺少错误监听;需检查 H.264+AAC 编码、配置 video/mp4 类型、添加 muted 属性、绑定 onerror 事件并按顺序排查。

video 标签黑屏,先看是不是 编码 格式不匹配
绝大多数黑屏问题根本不是代码写错了,而是视频文件本身不被 浏览器 解码——比如你用 Xvid 或 MPEG-2 编码的 .mp4 文件,浏览器能播声音但画面全黑,因为 HTML5 只认 H.264(AVC)视频流 + AAC 音频流的组合。
- 用
ffprobe input.mp4检查编码:确认codec_name是h264(不是mpeg4、av1或vp9)且音频是aac - 不放心就重封装:用 FFmpeg 强制转成标准兼容格式:
ffmpeg -i input.mp4 -c:v libx264 -profile:v baseline -c:a aac -movflags +faststart output.mp4 -
baselineProfile 是 iOS 和旧 安卓 设备的关键;+faststart让视频头移到文件开头,避免加载卡顿
服务器没返回正确的 Content-Type 就会黑屏
哪怕视频文件完全合规,如果 Web 服务器返回 Content-Type: application/octet-stream 或空着不设,iOS Safari 和部分 Android 浏览器直接拒绝解码,只留黑框。
- 检查响应头:在 Chrome DevTools 的 Network → Headers 里找
Content-Type,MP4 必须是video/mp4 - Nginx 配置示例(加在
http或server块内):types {video/mp4 mp4; video/webm webm; video/ogg ogg;} - Apache 用户加一行到
.htaccess:AddType video/mp4 .mp4
移动端自动播放触发黑屏,别硬上 autoplay
iOS 和 Android Chrome 对有声音的自动播放做了严格限制:未用户交互就调 play() 会静音、失败甚至黑屏。更糟的是,某些机型在 autoplay + loop 下首次渲染就卡死帧。
- 去掉
autoplay属性,改用用户点击后手动触发:document.querySelector('video').play().catch(e => console.warn('Auto-play prevented:', e)); - 务必加
muted属性(即使你本意要声音),否则 iOS 直接拒播: - 用
poster属性兜底:,避免白屏 / 黑屏空白期
监听错误比猜更容易定位黑屏原因
黑屏时控制台未必报错,但 error 事件一定会触发。不监听它,等于放弃第一手线索。
立即学习 “ 前端免费学习笔记(深入)”;
- 给
绑定onerror并打印error对象:video.addEventListener('error', () => {console.error('Video error:', video.error?.code, video.error?.message); }); - 常见
code值:MediaError.MEDIA_ERR_DECODE(解码失败)、MEDIA_ERR_NETWORK(404 或 CORS)、MEDIA_ERR_SRC_NOT_SUPPORTED(格式不支持) - 顺手加个
canplay监听,确认资源加载完成再移除 loading 状态,避免“闪黑”
真正卡住人的,往往不是某一个配置项,而是多个条件叠加:比如服务器 MIME 错了 + 视频用了 AV1 编码 + 移动端没加 muted —— 这时候只改其中一项,黑屏照旧。排查时得按顺序过一遍,别跳步。