有没有办法让振荡器节点在iOS设备上产生声音



我正在开发一个带有钢琴键盘的音乐网络应用程序。当用户按下钢琴键时,我使用振荡器节点播放与该键对应的简短音调:

const audioCtx = new (window.AudioContext || window.webkitAudioContext)();
function playNote(note) {
let oscillator;
let freq = notes[note];
console.debug(note + " (" + freq + " Hz)");
oscillator = audioCtx.createOscillator(); // create Oscillator node
oscillator.type = wavetypeEl.val(); // triangle wave by default
oscillator.frequency.setValueAtTime(freq, audioCtx.currentTime); // freq = value in hertz
oscillator.connect(audioCtx.destination);
oscillator.start();
oscillator.stop(audioCtx.currentTime + 0.5);
}
$('#keyboard button').on('click', (e) => {
playNote(e.target.dataset.note);
});

这适用于我尝试过的所有桌面和安卓浏览器,但iOS坚决拒绝播放任何声音。我发现我需要一个用户交互;解锁";iOS上的AudioContext,但我本以为从我的点击函数调用playNote()就可以了。

根据苹果公司的说法,我应该能够在我的振荡器对象上使用noteOn(),而不是像我在示例中那样使用oscillator.start()。但这似乎不是一个有效的方法。

我一定错过了一些简单的东西。有人知道吗?

如果一切正常,可能是设备本身处于静音状态。由于某种原因(或者根本没有原因(,当设备静音时,Safari不会播放任何来自Web Audio API的声音。但它发挥了其他一切。

有一些巧妙的方法可以绕过这个bug,基本上是在使用WebAudio API之前先播放带有音频元素的内容。

例如,unmute ios audio是一个实现上述破解的库。

我有一部iPhone XS Max,演示版可以像现在这样产生声音。。。我还读到,对于iOS,元素需要同时设置onClick处理程序和{cursor:pointer}样式才能正常工作。(从几年前开始(似乎它在起作用。

最新更新