video.playbackRate需在loadeddata或canplay事件后设置才生效,Safari iOS仅支持特定离散值,超限值会被截断,ratechange事件在Safari中可能不触发,audio标签变速会变调,精细控制需用Web Audio API。

video 元素的 playbackRate 属性能直接改,但只对已加载的媒体生效
浏览器原生 <video> 支持 playbackRate,但它不是“设置即生效”的开关——必须等 loadedmetadata 或更晚的事件触发后才能安全赋值,否则多数浏览器会静默忽略或抛 InvalidStateError。
- 常见错误现象:
video.playbackRate = 1.5写在DOMContentLoaded里,结果播放时仍是 1x - 正确时机:监听
loadeddata或canplay后设置,例如video.addEventListener('canplay', () => { video.playbackRate = 1.5; }); - 注意兼容性:
playbackRate在 Safari iOS 10+、Chrome 25+、Firefox 20+ 均支持,但旧版 Android WebView 可能完全不响应
设置非整数倍速(如 0.75、1.25)时,playbackRate 的取值范围受浏览器限制
不同浏览器对可设速率的上下限不同,硬写超限值不会报错,但会被自动截断到合法区间,且行为不一致。
- Chrome/Edge:允许
0.0625到16,但低于0.5时音频常被静音(即使muted未设) - Safari macOS:最低支持
0.5,设0.4会变成0.5;iOS Safari 更严,仅接受0.5/0.67/0.8/1/1.25/1.5/2这几个离散值 - 实操建议:设置前先读一次
video.playbackRate看当前值,再用video.playbackRate = Math.max(0.5, Math.min(2, desiredRate))做兜底
用 JavaScript 动态切换速率时,ratechange 事件不一定触发
ratechange 是唯一能监听速率变更的原生事件,但它有陷阱:手动赋值后,部分浏览器(尤其是 Safari)不触发该事件,哪怕 playbackRate 实际已变。
- 容易踩的坑:依赖
ratechange更新 UI 播放速度显示,结果 Safari 下按钮状态卡死 - 解决方法:赋值后主动触发自定义逻辑,比如
video.playbackRate = 1.5; updateSpeedDisplay(1.5); - 别信
video.readyState:它和速率无关,不能用来判断playbackRate是否就绪
audio 标签也支持 playbackRate,但 Web Audio API 更适合精细控制
如果只是简单变速(比如播客快进),<audio> 的 playbackRate 够用;但要做变速不变调、实时调节或混音,就得切到 Web Audio API。
立即学习“前端免费学习笔记(深入)”;
-
<audio>的playbackRate是粗粒度重采样,变速同时必然变调(1.5x 播放 → 音高升高约 7 个半音) - Web Audio 的
AudioBufferSourceNode.playbackRate可配合OfflineAudioContext做变速不变调预处理,但延迟高、内存开销大 - 真要实时无损变速,得用
ScriptProcessorNode(已废弃)或AudioWorklet,复杂度陡增——普通项目别碰
playbackRate 时,最麻烦的是 Safari 的离散值限制和 iOS 的静音策略,这两点不提前测,上线后用户反馈“调不了速”基本就出在这儿。



















