stereopannernode 可实现单声道音频在立体声场中的左右平滑定位,通过设置 pan 属性(-1 到 +1)控制声像位置,并需连接音频源→panner→destination,配合线性渐变或鼠标映射实现动态控制。

使用 AudioContext 的 StereoPannerNode 可以轻松控制单声道音频在立体声场中的左右定位,实现声音从左耳到右耳的平滑移动效果。关键在于创建 panner 节点并动态设置其 pan 属性(范围 -1 到 +1)。
创建并连接 StereoPannerNode
先获取音频上下文,将音频源(如 OscillatorNode 或 AudioBufferSourceNode)连接到 StereoPannerNode,再连到目的地:
const audioCtx = new (window.AudioContext || window.webkitAudioContext)(); const oscillator = audioCtx.createOscillator(); const panner = audioCtx.createStereoPanner(); // 创建立体声声像器 <p>oscillator.connect(panner); // 源 → panner panner.connect(audioCtx.destination); // panner → 输出(耳机/扬声器)</p><p>oscillator.start(); </p>
控制左右移动:设置 pan 值
pan 属性决定声音位置:
- -1:声音完全在左声道(仅左耳听到)
- 0:声音居中(双耳等量)
- +1:声音完全在右声道(仅右耳听到)
- 中间值(如 0.3、-0.7)实现渐变定位
可直接赋值或用 setValueAtTime() + linearRampToValueAtTime() 实现平滑过渡:
// 立即移到左侧 panner.pan.value = -1; <p>// 从左缓慢移到右侧(1秒内) panner.pan.setValueAtTime(-1, audioCtx.currentTime); panner.pan.linearRampToValueAtTime(1, audioCtx.currentTime + 1); </p>
实时移动示例:鼠标拖动控制声像
绑定鼠标或触摸事件,将横坐标映射为 -1 ~ +1 的 pan 值:
const container = document.getElementById('pan-container');
container.addEventListener('mousemove', (e) => {
const rect = container.getBoundingClientRect();
const x = e.clientX - rect.left;
const panValue = (x / rect.width) * 2 - 1; // 0→-1, width→+1
panner.pan.value = Math.max(-1, Math.min(1, panValue));
});
注意:移动端需监听 touchmove,并取 touches[0] 坐标。
注意事项与常见问题
- 必须是单声道输入:StereoPanner 设计用于处理 mono 输入;若输入已是立体声,panner 效果可能不明显或异常
-
避免直接修改 value 频繁触发突变:动画类移动建议用
linearRampToValueAtTime或exponentialRampToValueAtTime保证平滑 -
需用户手势触发音频上下文启动:现代浏览器要求首次播放必须由用户交互(如点击)触发
audioCtx.resume() -
兼容性良好:Chrome 55+、Firefox 53+、Safari 12.1+ 均支持
createStereoPanner()
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











