gpt4 book ai didi

javascript - 网络音频 5.1(6 声道)输出

转载 作者:搜寻专家 更新时间:2023-11-01 04:16:35 26 4
gpt4 key购买 nike

我正在尝试通过 channelsplitter 将立体声音频路由到具有增益控制的 6 个 channel ,然后返回到 channelMerger,以控制 5.1 组的所有 6 个 channel .设备通过HDMI连接,windows正确输出到所有6个 channel (一个可以让所有6个扬声器单独播放声音的屏幕)。

我能找到的唯一例子有这段代码:

if (context.destination.maxChannelCount >= 6) {
context.destination.channelCount = 6;
}
else {
context.destination.channelCount = 2;
}

初始化 audiocontext 时,我的 channelCount 默认为 2,maxChannelCount 为 6。

我使用以下代码创建拆分器、合并器和中间的增益:

if (context.destination.maxChannelCount >= 6) {
context.destination.channelCount = 6;
}
else {
context.destination.channelCount = 2;
}

context.destination.channelCountMode = "explicit";
context.destination.channelInterpretation = "discrete";

var ammount = context.destination.channelCount;

console.log('Ammount of channels:',ammount); //this outputs 6

window.channelSplitter = context.createChannelSplitter(ammount);
window.channelMerger = context.createChannelMerger(ammount);

postGain.connect(channelSplitter); //postGain is the last node of the audio system
channelMerger.connect(context.destination);
window.channelGains = [];
for(i=0;i<ammount;i++){
channelGains[i] = context.createGain();

channelSplitter.connect(channelGains[i],i,0);
channelGains[i].connect(channelMerger,0,i);
}

我在 chrome(39.0.2171.71 m) 中试过这个,其中 maxChannelCount 是 6。Firefox 输出 2。

编辑:在摆弄 channelSplitter 之后,我发现除了前两个之外的所有输出都保持沉默。根据spec,这是正确的,当使用 channel 解释“扬声器”时。这意味着我需要自己填充 channel ,可能使用描述的算法 here .我仍然需要检查 chrome 是否正确输出所有 6 个 channel 。

最佳答案

问题是由于 channelSplitter 没有在所有 channel 上输出(这是我所预料的)。尽管根据规范,此行为是正确的。因此我们需要编写自己的立体声到 5.1 上混器。但是为了测试声音输出,我使用了左声道,我能够独立地输出到所有 6 个声道。我只遇到一个问题。 connect 方法的输入参数(第 3 个)不决定输出的顺序,如 here 所示。 . .connect() 的调用顺序决定了输出的顺序。但是,第三个数字需要存在并且与我调用 .connect 的其他时间不同(但在输入的数量范围内)。

另一件事我注意到合并器和拆分器上的 channelCount 等于 2。但是我发现它 does not matter when having channelCountMode set to max

除此之外,我还摆弄了所有这些设置,但它们对此没有任何影响。唯一重要的事情是将目标节点上的 channelCount 设置为 maxChannelCount。

但是,当没有将所有 channel 连接到 channel 合并器时,合并器会根据 these 对输入信号进行上混。规则。当将 channelInterpretation 设置为 explicit 时,您仍然会得到上混结果,而根据规范,它应该填充 channel ,并让每个没有输入的 channel 为空(因此只输出第一个 channel 到左声道,并保持右输出静音)。

下面是一个用来摆弄立体声 channel 的片段。

onload = function(){
window.context = new AudioContext();
window.source = context.createMediaElementSource(document.getElementById('player'));
window.splitter = context.createChannelSplitter(2);
source.connect(splitter);
window.merger = context.createChannelMerger(2);

window.leftGain = context.createGain();
window.rightGain = context.createGain();

splitter.connect(leftGain, 0, 0);
splitter.connect(rightGain, 1, 0);


//--------try (de)commenting things below-------
leftGain.connect(merger, 0, 0);
rightGain.connect(merger, 0, 1);
//merger.channelInterpretation = 'discrete' //doesn't seem to have influcence..
//merger.channelCountMode = 'explicit' //makes everything only output to the left channel

//-------until here------

merger.connect(context.destination);

var leftRange = document.querySelector('#left');
var rightRange = document.querySelector('#right');
leftRange.oninput = function(){leftGain.gain.value = this.value}
rightRange.oninput = function(){rightGain.gain.value = this.value}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<audio src="http://upload.wikimedia.org/wikipedia/en/4/45/ACDC_-_Back_In_Black-sample.ogg" controls autoplay id="player" preload></audio><br />
<label for="left">Left channel</label>
<input type="range" min=0 max=1 step=.01 value=1 id="left" /><br />
<label for="right">Right channel</label>
<input type="range" min=0 max=1 step=.01 value=1 id="right" />
</body>
</html>

关于javascript - 网络音频 5.1(6 声道)输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27194177/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com