簡體   English   中英

Web 音頻 API ChannelMergerNode 在 Safari 上未按預期工作

[英]Web audio API ChannelMergerNode not working as expected on Safari

我使用 ChannelMergerNode 創建了一個簡單的 jsfiddle,在右揚聲器上播放振盪器。 它在 Chrome 上按預期工作,但在 Safari 上,聲音會在兩個揚聲器(左右)播放。

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);

https://jsfiddle.net/RivkaB/tcnofjy1/16/

知道如何解決這個問題嗎? 謝謝你。

ChannelMergerNode接口用於將由ChannelSplitterNode拆分的通道合並為單個通道。 您獲得的平移效果可能是該節點的 Chrome 實現的副作用,盡管我不確定。

如果您不想創建立體聲平移效果,請創建一個StereoPannerNode ,它允許您控制左右兩側的 output。

StereoPannerNode具有pan屬性。 此屬性有一個value屬性,它可以是從-1 (左)到1 (右)的數字,其中0是中心。

 const buttons = document.querySelectorAll('button'); const audioContext = new AudioContext(); const stereoPannerNode = audioContext.createStereoPanner(); const oscillatorNode = audioContext.createOscillator(); oscillatorNode.connect(stereoPannerNode); stereoPannerNode.connect(audioContext.destination); for (const button of buttons) { button.addEventListener('click', function() { if (button.value === 'play') { oscillatorNode.start(); } else if (button.value === 'left') { stereoPannerNode.pan.value = -1; } else if (button.value === 'right') { stereoPannerNode.pan.value = 1; } else { stereoPannerNode.pan.value = 0; } }); }
 <button value="play">Play</button> <button value="left">Only left</button> <button value="right">Only right</button> <button value="both">Both</button>

我認為 Safari 尚未更新其ChannelMergerNode以遵循規范。 已經有一段時間了,但我認為發生的事情是,由於您只連接一個輸入,output 只包含一個通道,基本上忽略了未連接的輸入 0。

如果您希望它與 Safari 一起使用,您需要將某些東西連接到輸入 0。這可能是您的振盪器連接到零增益節點。 或者可能是一個帶有全零緩沖區的循環AudioBufferSourceNode

但我也不是 100% 肯定這會奏效。 如果這不起作用,請使用具有非常小的值的AudioBufferSourceNode ,例如 1e-20。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM