AudioContext 的 sampleRate 是只读属性,由系统自动确定且不可更改,所有音频处理必须适配该值而非强行替换。

AudioContext 创建时自动采用当前音频设备的原生采样率,这个值不可更改、无需手动设置,也不应强行“转换”——真正需要的是适配而非替换。
理解 sampleRate 的本质
调用 new AudioContext() 后,audioCtx.sampleRate 立即可读,返回的是操作系统与硬件协商后的实际采样率(如 44100、48000 或 96000 Hz)。它不是配置项,而是运行时事实。浏览器选择该值是为了最小化重采样开销和延迟,你无法通过 API 强制设为某个数值,赋值操作会被忽略或报错。
避免采样率不匹配导致的问题
常见错误是预设缓冲区采样率与上下文不符,引发变调或变速:
- 创建 AudioBuffer 时务必使用
audioCtx.createBuffer(channels, length, audioCtx.sampleRate),而不是硬写 44100 - 加载外部音频文件后,若其原始采样率与上下文不同,
decodeAudioData()会自动重采样到上下文采样率,输出的AudioBuffer.sampleRate总是等于audioCtx.sampleRate - 用
OfflineAudioContext渲染离线音频时可指定采样率(如new OfflineAudioContext(2, 44100, 44100)),但这仅影响渲染结果,不改变实时播放行为
动态计算要以 context.sampleRate 为准
所有基于时间或频率的运算,都应实时读取并依赖 audioCtx.sampleRate:
立即学习“前端免费学习笔记(深入)”;
- FFT 分辨率 =
audioCtx.sampleRate / fftSize,而非固定除以 44100 - 计算播放起始偏移点:
Math.floor(timeSec * audioCtx.sampleRate) - 设计滤波器参数(如截止频率)时,直接传入物理频率值,Web Audio 内部会按当前采样率归一化
应对设备切换的实用做法
系统级采样率可能随输出设备变化(例如从笔记本扬声器切到 USB 声卡),但 Web Audio 没有“采样率变更”事件:
- 监听
navigator.mediaDevices.ondevicechange,在设备变更后重建 AudioContext(注意:会中断播放,需暂停/恢复状态) - 首次创建时记录
audioCtx.sampleRate,后续所有音频处理逻辑均基于此值,不假设固定值 - 不主动轮询或反复重建上下文——sampleRate 在单个 AudioContext 生命周期内恒定,刷新页面才是最可靠同步方式



















