javascript WebAudio声相器无法与WebRTC音频流一起正常工作

huwehgph  于 2023-02-21  发布在  Java
关注(0)|答案(2)|浏览(102)

我有一个问题,我的音频平移器是不正确的平移与给定的值。
目前,如果我将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;
}
pqwbnv8z

pqwbnv8z1#

您的recvAudio音频元素直接扩散原始MediaStream,而不受PannerNode影响。

var source = this.aContext.createMediaStreamSource(event.stream);
///...
    recvAudio.srcObject = source.mediaStream;

在这个代码片段中,source.mediaStreamevent.stream是完全相同的对象。
x一个一个一个一个x一个一个二个x
因此,当您超出参考距离[-1~1]时,AudioContext的输出声音将低于此Audio元素的声音,您会觉得PannerNode不再工作,因为Audio元素的输出覆盖了它。
要解决这个问题,最好的方法可能是在这里根本不使用Audio元素,因为您可以让AudioContext输出声音本身,所以您实际上并不需要它。
但如果您确实需要使用Audio元素,请不要将AudioPanner节点连接到上下文的目的地,而是将其连接到MediaStreamDestinationNode并将后者作为Audio元素的srcObject传递:

//...
    panner.positionX.value = 10000;

    const source = this.aContext.createMediaStreamSource(event.stream);
    const destination = this.aContext.createMediaStreamDestination();
    source.connect(panner);
    panner.connect(destination);

    const recvAudio = new Audio();
    recvAudio.srcObject = destination.stream;
    recvAudio.autoplay = true;
//...

https://jsfiddle.net/do9xq681/

332nm8kg

332nm8kg2#

您需要设置listner的位置!它的位置决定了源节点的平移。
默认情况下,listner的位置是(0,0,0),这就是为什么当您将源节点设置为低值时,可以在此处显示它。
您可以使用以下命令设置列表器的位置:

var const listener = this.aContext.listener;
listener.setPosition(x,y,z);

相关问题