问题描述
目标
我正在尝试建立一个具有空间音频的网站。
测量
我正在使用WebAudioAPI的PannerNode
。
我的音频管道看起来像:audioTrack → PannerNode → audioContext.destination
期望
我认为PannerNode会尽一切努力来创建3D音频体验。
问题
我感觉左右扬声器之间没有声音延迟。发生这种声音延迟的原因是两只耳朵彼此之间有一定的空间距离。
问题
- 我感觉不对吗,左右扬声器之间确实存在延迟? (也许我的设置错误/不是最佳设置。)
- 是否存在一种方便的方法来实现声音延迟,还是需要手动进行
track -> PannerNode -> SplitAudioInChannels -> ApplySoundDelayPerChannel -> Output
?
我基本上是在使用mozilla's tutorial here中的代码。
PannerNode的设置如下:
var panner = new PannerNode(audioCtx,{
panningModel: 'HRTF',distanceModel: 'linear',positionX: audioSource.x,positionY: audioSource.y,positionZ: 0,orientationX: 0.0,orientationY: 0.0,orientationZ: 0.0,// -1 = face out of the screen
refdistance: 1,maxdistance: 400,rolloffFactor: 10,coneInnerAngle: 360,//60,coneOuterangle: 360,//90,coneOuterGain: 0.3
})
解决方法
要听到空间化效果,您需要更改方向和/或位置。要查看您的声像器是否正在执行某项操作,请查看Canopy以查看声像器的左右声道。调整位置和/或方向应显示左右声道之间存在延迟差异。
这是在Canopy中使用的简短示例,以显示左右声道的延迟有所不同。将此粘贴到代码窗口中,然后按左侧的三角形进行渲染。您会在顶部看到波形,每个通道一个。如果放大,可以看到第一个频道与第二个频道不在同一时间。
// @channels 2
// @duration 1.0
// @sampleRate 44100
let osc = new OscillatorNode(context,{type: "square");
let p = new PannerNode(context);
p.panningModel = "HRTF";
p.positionX.value = 10;
p.positionY.value = 10;
p.positionZ.value = 10;
osc.connect(p).connect(context.destination);
osc.start();