HTML5原生video不支持运行时清晰度切换,需通过替换src、切换source或MSE(HLS/DASH)实现;MP4切换有黑屏风险,HLS/DASH才是自适应首选。
本身不支持运行时切换清晰度浏览器原生 元素没有内置的「清晰度切换」能力,quality、res 这类属性并不存在于标准中。所谓“切换清晰度”,本质是**替换 src 或切换 元素**,或使用 MSE(Media Source Extensions)动态加载不同码率的分片(如 HLS/DASH)。直接改 video.src 最简单,但有黑屏、卡顿、丢失播放进度等风险。
并重新加载适用于预置几档固定分辨率 MP4 文件的轻量场景。关键点不是只改 src,而是触发 load() 并手动恢复播放状态:
video.currentTime 和 video.paused 状态video.src 或清空/重写 后调用 video.load()
load() 触发 loadedmetadata 事件后,再 seekTo() 并按需 play()
load() 后 seek 支持不稳定,可能跳回开头MP4 是单一文件,无法动态调整;而 HLS(.m3u8)和 DASH(.mpd)是索引+分片协议,播放器可实时选择不同码率的片段。浏览器原生仅支持 HLS(iOS/macOS
Safari),DASH 需靠 dash.js 或 hls.js 这类 JS 库。
hls.js 在 Chrome/Firefox/Edge 中模拟 HLS 支持,提供 hls.levels 和 hls.currentLevel APIhls.currentLevel = index 即可切换,库会自动处理缓冲、无缝过渡(若时间戳对齐)dash.js,通过 player.getBitrateInfoList() 和 setQualityFor('video', level)
很多开发者只关注“能切”,却在体验上翻车:
readyState 时 currentTime 设置无效)
loadeddata 触发,导致用户连点多次引发竞态play() 必须由用户手势触发,不能在异步回调里静默调用controls,自定义清晰度按钮建议用 display: none 隐藏原生控件,避免 UI 冲突Accept-Ranges: bytes
hls.js 加一个 .m3u8 主清单,几乎是最省心、兼容性最好、体验最接近原生的路径。