IT序号网

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

telwanggs 2023年06月13日 编程语言 546 0

我正在尝试通过 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>


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!