我正在開發一個帶有鋼琴鍵盤的音樂網路應用程式。當用戶按下鋼琴鍵時,我正在使用 OscillatorNode 播放與該鍵對應的簡短音調:
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);
});
這適用于我嘗試過的所有桌面和 Android 瀏覽器,但 iOS 頑固地拒絕播放任何聲音。我看到我需要用戶互動來“解鎖”iOS 上的 AudioContext,但我原以為playNote()從我的 click 函式呼叫就可以了。
根據 Apple的說法,我應該能夠noteOn()在我的振蕩器物件上使用,而不是oscillator.start()我在示例中使用它的方式。但這似乎不是一個有效的方法。
我必須在這里遺漏一些簡單的東西。有人知道嗎?
uj5u.com熱心網友回復:
如果一切似乎都運行良好,則可能是設備本身處于靜音狀態。出于某種原因(或根本沒有原因),當設備靜音時,Safari 不會播放來自 Web Audio API 的任何聲音。但它會播放其他所有內容。
有一些 hacky 方法可以規避這個錯誤,這些方法基本上是在使用 Web Audio API 之前先播放帶有音頻元素的東西。
例如, unmute-ios-audio是一個實作上述 hack 的庫。
uj5u.com熱心網友回復:
我有一個 iPhone XS Max,演示可以在它上面產生聲音,就像你現在擁有的那樣......我還讀到對于 iOS,元素需要 onClick 處理程式和 {cursor:pointer} 樣式設定才能正常作業.(截至幾年前)似乎它正在作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/518658.html
下一篇:html更改不會顯示在瀏覽器中
