Javascript 将多个PannerNode连接到输出
我试图将多个PannerNode连接到一个输出,但在正确连接它们时遇到问题(测试时没有音频)。音频是多通道的,所以我想分别处理每个通道,音频是html视频元素的形式 我的主要问题是,我有6个不同的PannerNode,每个PannerNode有一个带有2个通道的输出,我不知道如何正确地将它们连接到目标以获得立体声输出(或任何输出,但我的系统只支持立体声) 以下是我正在做的:Javascript 将多个PannerNode连接到输出,javascript,audio,web-audio-api,Javascript,Audio,Web Audio Api,我试图将多个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);
}