AudioContext 的 sampleRate 属性是只读的,反映当前硬件设备原生采样率,由系统和浏览器在创建时自动决定,无法通过代码设置或更改,开发者应以其为基准进行动态计算以确保音频行为一致。

AudioContext 的 sampleRate 属性是只读的,不能“适配”或“设置”采样率;它反映的是当前音频上下文实际运行的硬件采样率,由系统和浏览器在创建时自动决定。 你无法通过代码主动切换或强制匹配不同设备的采样率——这是底层音频引擎(如 WASAPI、Core Audio、ALSA)和浏览器策略共同决定的,开发者只能读取并响应它。
理解 sampleRate 的真实含义
当你执行:
const audioCtx = new AudioContext();
console.log(audioCtx.sampleRate);
输出的数值(如 44100、48000 或 96000)表示该 AudioContext 正在使用的**当前音频设备的原生采样率**。这个值在 AudioContext 创建后就固定了,后续无法更改。
为什么不能手动设为 44.1kHz 或 48kHz?
- 浏览器会根据操作系统音频子系统、默认输出设备能力及内部调度策略选择最合适的采样率,以减少重采样开销和延迟。
- Web Audio API 不提供
setSampleRate()或类似接口;sampleRate是只读属性(readonly attribute double sampleRate),试图赋值会静默失败或抛出 TypeError。 - 即使你用
OfflineAudioContext(1, length, 44100)指定离线上下文的采样率,那也只是用于渲染,不改变实时播放设备的行为。
如何合理应对多设备采样率差异?
-
以 sampleRate 为基准做动态计算:例如设计一个 1024 点 FFT 分析器时,频率分辨率 =
audioCtx.sampleRate / 1024,而不是硬编码 44100 / 1024。 -
避免预设 buffer 采样率与上下文不一致:用
audioCtx.createBuffer(channels, length, audioCtx.sampleRate)创建缓冲区,确保其采样率与上下文对齐,否则播放会变调或变速。 -
监听 audio device 变更(有限支持):目前 Web 标准未暴露“采样率变更”事件,但可结合
navigator.mediaDevices.ondevicechange+ 重建 AudioContext 来间接响应设备切换(注意:重建会中断音频,需妥善处理状态)。 -
接受差异,专注逻辑一致性:Web Audio 的时间模型(如
currentTime、start(t))本身基于 context 的 sampleRate 自动归一化,你无需为不同采样率写分支逻辑——只要用 context 的 sampleRate 做计算,行为就是正确的。
一个实用检查示例
可在初始化时打印并校验:
const ctx = new (window.AudioContext || window.webkitAudioContext)();
console.log(`AudioContext running at ${ctx.sampleRate} Hz`);
// 后续所有 buffer、定时、滤波器参数都基于 ctx.sampleRate 计算
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











