我有一个问题,我的音频平移器是不正确的平移与给定的值。
目前,如果我将positionX.value设置为1000,音频将像在中间一样播放,根本不会平移到右声道。
现在,如果我将positionX.value设置为0.5、0.9或1,音频将在右声道播放(即使不是完全播放,因为我仍然可以在左侧听到一点,比平时多)。
我不明白为什么它只能从-1到1工作,任何高于1的数字音频都回到中心。知道为什么吗?而且我确信它应该可以在更高的数字下工作,因为我以前在不同的情况下测试过它,文档中没有任何说明它不应该。
peerConnection.onaddstream = (event) => {
var panner = this.aContext.createPanner();
panner.panningModel = 'HRTF';
panner.distanceModel = 'inverse';
panner.refDistance = 1;
panner.maxDistance = 10000;
panner.rolloffFactor = 1;
panner.coneInnerAngle = 360;
panner.coneOuterAngle = 0;
panner.coneOuterGain = 0;
// here is how Im setting the position, using -1 to 1 works, nothing greater tho
panner.positionX.value = 10000;
var source = this.aContext.createMediaStreamSource(event.stream);
source.connect(panner);
panner.connect(this.aContext.destination);
const recvAudio = new Audio();
recvAudio.srcObject = source.mediaStream;
recvAudio.autoplay = true;
}
2条答案
按热度按时间pqwbnv8z1#
您的
recvAudio
音频元素直接扩散原始MediaStream,而不受PannerNode影响。在这个代码片段中,
source.mediaStream
与event.stream
是完全相同的对象。x一个一个一个一个x一个一个二个x
因此,当您超出参考距离[-1~1]时,AudioContext的输出声音将低于此Audio元素的声音,您会觉得PannerNode不再工作,因为Audio元素的输出覆盖了它。
要解决这个问题,最好的方法可能是在这里根本不使用Audio元素,因为您可以让AudioContext输出声音本身,所以您实际上并不需要它。
但如果您确实需要使用Audio元素,请不要将AudioPanner节点连接到上下文的目的地,而是将其连接到MediaStreamDestinationNode并将后者作为Audio元素的
srcObject
传递:https://jsfiddle.net/do9xq681/
332nm8kg2#
您需要设置listner的位置!它的位置决定了源节点的平移。
默认情况下,listner的位置是(0,0,0),这就是为什么当您将源节点设置为低值时,可以在此处显示它。
您可以使用以下命令设置列表器的位置: