Javascript Web音频API ChannelMergerNode在Safari上未按预期工作

Javascript Web音频API ChannelMergerNode在Safari上未按预期工作,javascript,html5-audio,web-audio-api,Javascript,Html5 Audio,Web Audio Api,我使用ChannelMergerNode创建了一个简单的JSFIDLE,在右边的扬声器上播放振荡器。 它可以在Chrome上正常工作,但在Safari上,声音会同时播放到两个扬声器(左右) 你知道如何解决这个问题吗? 多谢各位 使用ChannelMergerNode接口将被ChannelSplitterNode拆分的频道合并到单个频道中。您得到的平移效果可能是该节点的Chrome实现的副作用,尽管我不确定 如果您不想创建立体平移效果,请创建一个可以控制左右两侧输出的 StereoPannerN

我使用ChannelMergerNode创建了一个简单的JSFIDLE,在右边的扬声器上播放振荡器。 它可以在Chrome上正常工作,但在Safari上,声音会同时播放到两个扬声器(左右)

你知道如何解决这个问题吗?
多谢各位

使用
ChannelMergerNode
接口将被
ChannelSplitterNode
拆分的频道合并到单个频道中。您得到的平移效果可能是该节点的Chrome实现的副作用,尽管我不确定

如果您不想创建立体平移效果,请创建一个可以控制左右两侧输出的

StereoPannerNode
具有
pan
属性。此属性有一个
属性,该属性可以是介于
-1
(左)到
1
(右)之间的数字,其中
0
为中心

const buttons=document.queryselectoral('button');
const audioContext=新的audioContext();
const stereoPannerNode=audioContext.createStereoPanner();
const oscillatorNode=audioContext.createOscillator();
振荡节点连接(立体平移节点);
stereoPannerNode.connect(audioContext.destination);
用于(按钮中的常量按钮){
addEventListener('click',function(){
如果(button.value==='play'){
oscillatorNode.start();
}else if(button.value==='left'){
stereoPannerNode.pan.value=-1;
}else if(button.value==='right'){
stereoPannerNode.pan.value=1;
}否则{
stereoPannerNode.pan.value=0;
}
});
}
播放
只剩下
唯一正确的

两者都是
我认为Safari没有更新它的
ChannelMergerNode
以遵循规范。已经有一段时间了,但我认为发生的是,由于您只连接一个输入,所以输出只包含一个通道,基本上忽略了未连接的输入0

如果您想让它与Safari一起使用,则需要将某些内容连接到输入0。这可能是连接到零增益节点的振荡器。或者可能是一个缓冲区为全零的循环
AudioBufferSourceNode


但我也不是100%肯定这会奏效。如果这不起作用,请使用
AudioBufferSourceNode
和一个非常小的值,如1e-20。

您只是想在右扬声器上播放一个声音,还是需要
ChannelMergerNode
来实现更多的目的?我的音频需求并不是那么简单。我需要只在左右耳上播放,或者同时在左右耳上播放一种声音。@rivka这有什么帮助吗?iOS Safari不支持StereoPannerNode。
var audioContext = window.AudioContext || window.webkitAudioContext;
var context = new audioContext();
var merger = context.createChannelMerger();
merger.connect(context.destination);
var osc = context.createOscillator();
osc.connect(merger, 0, 1);
osc.start();
osc.stop(10.0);