ios safari 仅支持 playbackrate 设为 0.5、1.0、1.5、2.0 四个离散值,设其他值会静默回落至 1.0;须在 loadedmetadata 后设置并验证生效,且首次有声播放需用户手势触发。

audio.playbackRate 在 iOS Safari 上根本设不了
iOS Safari(含微信内嵌 WebView)对 audio 标签的 playbackRate 有硬性限制:只接受 0.5、1.0、1.5、2.0 四个离散值。设 1.25 或 1.75 不会报错,但会静默回落到 1.0,看起来“没反应”。
这不是 bug,是 WebKit 强制策略。桌面 Chrome 和 Firefox 支持连续值(如 0.0625–16.0),但教学/播客类音频在 >2.0 后人声失真明显,实际推荐守住 0.75–2.0 区间。
- 必须在
loadedmetadata事件后设置,否则无效(readyState为 0 时赋值被忽略) - 避免用
canplay:它可能在元数据未完全加载时就触发,导致速率未生效 - 设完立刻读取验证:
if (audio.playbackRate !== targetRate) { console.warn('实际生效:', audio.playbackRate); }
带声音的 autoplay + 倍速,在移动端基本不可行
现代浏览器(包括 iOS Safari)要求:首次有声播放必须由用户手势触发。哪怕你写了 autoplay 并设置了 playbackRate,只要没用户点击/触摸过页面,audio.play() 就会返回被 reject 的 Promise,控制台报 The play() request was interrupted。
- 删掉
autoplay属性,改用按钮显式触发:button.addEventListener('click', () => audio.play().catch(e => {})) - 不要在
DOMContentLoaded或window.onload里调play(),100% 失败 - iOS 要求触发元素在视口内、未被
display: none或opacity: 0遮挡,否则即使点过也静音 - 想静音自动播?
muted+autoplay在多数桌面浏览器可行;想有声自动播?只能等用户第一次交互后再调一次play()
audio 标签 fallback 写错,倍速根本没机会生效
90% 的音频兼容问题出在格式兜底错误,不是 JS 写错了。如果 audio 标签连播放都失败,playbackRate 就是空谈。
- 必须用
<source></source>多格式声明,只写src="a.mp3"等于把播放权交给浏览器掷骰子 -
type必须写对:audio/mpeg(不是audio/mp3),audio/ogg(Vorbis 编码,用ffprobe a.ogg确认) - 服务器响应头
Content-Type必须匹配:Apache 加AddType audio/mpeg .mp3,Nginx 补audio/mpeg mp3; - 本地开发别双击 HTML 文件——
file://协议下 Chrome/Firefox 直接屏蔽音频加载,改用python3 -m http.server 8000
倍速切换后状态丢失、体验割裂
用户反复切换倍速是常态,光能设不够,得记得住、看得清、不意外。
- 用
localStorage记住上次选择:localStorage.setItem('audioRate', '1.5'),下次打开自动恢复 - 每次切换后立刻更新 UI 显示文字(如“当前:1.5×”),不要等
ratechange事件(它不一定触发) - 提供明确档位按钮:
0.75×(精听)、1.0×(跟读)、1.25×(复习)、1.5×(速览),禁用负数和0 - 禁用
preload="auto":iOS 会忽略,且浪费流量;preload="metadata"更稳妥
真正难的不是写那行 audio.playbackRate = 1.5,而是确保这行代码执行时:音频已加载完成、浏览器允许播放、用户已授权、格式被正确识别、服务器没返回错的 MIME 类型——漏掉任一环,倍速就卡在“以为它动了”的假象里。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











