Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将多个PannerNode连接到输出_Javascript_Audio_Web Audio Api - Fatal编程技术网

Javascript 将多个PannerNode连接到输出

Javascript 将多个PannerNode连接到输出,javascript,audio,web-audio-api,Javascript,Audio,Web Audio Api,我试图将多个PannerNode连接到一个输出,但在正确连接它们时遇到问题(测试时没有音频)。音频是多通道的,所以我想分别处理每个通道,音频是html视频元素的形式 我的主要问题是,我有6个不同的PannerNode,每个PannerNode有一个带有2个通道的输出,我不知道如何正确地将它们连接到目标以获得立体声输出(或任何输出,但我的系统只支持立体声) 以下是我正在做的: 创建audioContext、MediaElementSource等和第一个连接 设置侦听器 创建PannerNodes并

我试图将多个PannerNode连接到一个输出,但在正确连接它们时遇到问题(测试时没有音频)。音频是多通道的,所以我想分别处理每个通道,音频是html视频元素的形式

我的主要问题是,我有6个不同的PannerNode,每个PannerNode有一个带有2个通道的输出,我不知道如何正确地将它们连接到目标以获得立体声输出(或任何输出,但我的系统只支持立体声)

以下是我正在做的:

  • 创建audioContext、MediaElementSource等和第一个连接
  • 设置侦听器
  • 创建PannerNodes并将其连接到拆分器
  • 
    var FrontLeft、FrontCenter、FrontRight、SurroundLeft、SurroundRight、Sub=null;
    var PannerNodeObject=[FrontLeft,FrontCenter,FrontRight,SurroundLeft,SurroundRight,Sub];
    函数集\u pannerNode(节点,panningModel/*'HRTF'*/,距离模型/*可能的值为“线性”、“反向”和“指数”。默认值为“反向”。*/,参考距离,最大距离,滚动因子,圆锥内角,圆锥外角,圆锥外增益,x,y,z/*位置*/,n/*PannerNodeObject的索引*/){
    node=context.createPanner();
    //设置选项
    node.panningModel=panningModel;
    node.distanceModel=距离模型;
    node.refDistance=refDistance;
    node.maxDistance=maxDistance;
    node.rolloffFactor=rolloffFactor;
    node.coneInnerAngle=coneInnerAngle;
    node.coneoutrangle=coneoutrangle;
    node.coneOuterGain=coneOuterGain;
    //设置位置
    node.positionX=x;
    node.positionY=y;
    node.positionZ=z;
    PannerNodesObject[n]=节点;
    }
    对于(i=0;i
  • 将节点连接到目标
  • 
    对于(i=0;i

    之后,我将更新循环中的每个PannerNode位置。但是我在播放视频时没有音频,所以我可能在AudioNodes连接上出了问题。

    你能举出一个单平移器工作的例子吗?如果你把它全部放在JSFIDLE或codepen或其他任何东西中,那也太棒了。
    
        const context = new AudioContext();
        
        var source = context.createMediaElementSource(video);
        
        var dest = context.createMediaStreamDestination();
        
        //Spliter channels L, R, SL, SR, C, LFE
        let splitter = new ChannelSplitterNode(context, {numberOfOutputs: 6});
    
        // I didn't used that later because I don't know if that is necessary and how to implement it properly (with that line commented it code is still not working correctly)
        let channel_merger = new ChannelMergerNode(context, {numberOfInputs: 2});
        
        let listener = context.listener;
        
        source.connect(splitter, 0, 0);
    
    
    
        if(listener.forwardX) {
            listener.forwardX.setValueAtTime(0, audioCtx.currentTime);
            listener.forwardY.setValueAtTime(0, audioCtx.currentTime);
            listener.forwardZ.setValueAtTime(-1, audioCtx.currentTime);
            listener.upX.setValueAtTime(0, audioCtx.currentTime);
            listener.upY.setValueAtTime(1, audioCtx.currentTime);
            listener.upZ.setValueAtTime(0, audioCtx.currentTime);
          } else {
            listener.setOrientation(0,0,-1,0,1,0);
          }
    
    
    
        var FrontLeft, FrontCenter, FrontRight, SurroundLeft, SurroundRight, Sub = null;
        
        var pannerNodesObjects = [FrontLeft, FrontCenter, FrontRight, SurroundLeft, SurroundRight, Sub];
        
        function set_pannerNode(node, panningModel /* 'HRTF' */, distanceModel /* Possible values are "linear", "inverse" and "exponential". The default value is "inverse". */, refDistance, maxDistance, rolloffFactor, coneInnerAngle, coneOuterAngle, coneOuterGain, x, y, z /* position */, n /* index of the pannerNodesObjects */) {
          
          node = context.createPanner();
        
          // Seting options
          node.panningModel = panningModel;
          node.distanceModel = distanceModel;
          node.refDistance = refDistance;
          node.maxDistance = maxDistance;
          node.rolloffFactor = rolloffFactor;
          node.coneInnerAngle = coneInnerAngle;
          node.coneOuterAngle = coneOuterAngle;
          node.coneOuterGain = coneOuterGain;
        
          // Setting position
          node.positionX = x;
          node.positionY = y;
          node.positionZ = z;
          pannerNodesObjects[n] = node;
        }
        
        for (i=0; i< pannerNodesObjects.length; i++){
            [nx, ny, nz] = set_rotation(distanceFromScreen,screenCenterY,angleList[i],i); // Here I get a position of the PannerNode
            set_pannerNode(pannerNodesObjects[i],'HRTF',"exponential", 1,100,2,360,0,0, nx, ny, nz, i);
            splitter.connect(pannerNodesObjects[i], i);
          }
    
    
    
        for (i=0; i< pannerNodesObjects.length; i++){
            pannerNodesObjects[i].connect(dest);
        }