- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试通过 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/
我想在我的 android 应用程序中播放 PCM 音频数据。网络上有很多示例,但仅用于单 channel ,我有 4 个 channel (如本问题标题所述)。 当我设置 AudioTrack au
我正在尝试通过 channelsplitter 将立体声音频路由到具有增益控制的 6 个 channel ,然后返回到 channelMerger,以控制 5.1 组的所有 6 个 channel .
我试图从 iPhone XS 的所谓立体声后置麦克风中获取两个 channel ,但在 AVAudioSession 的不同点上只能看到一个 channel 。和 AVAudioSessionPort
我是一名优秀的程序员,十分优秀!