我看了一下你的第二次尝试,似乎听起来不错(请原谅这个双关语)。然而,我只是试了一下,我能用这个得到很好的结果:
Freesound.org: UI Confirmation Alert, C4.wav
.
这将创建一个
AudioContext
Audio
并反复使用相同的、已加载的缓冲区。我还在试着看看是否有性能提升。
一
AudioBufferSourceNode
start()
再次发声。幸运的是,这些节点的创建成本非常低,
和实际情况
AudioBuffers
可重复用于的多个播放
声音事实上,您可以使用这些节点的方式是“开火后忘记”:
创建节点,调用
开始()
开始播放声音
甚至懒得提及它。它将自动
声音播放结束后的某个时间。
/*jslint browser:true, esversion:6, devel:true*/
/*global AudioContext*/
(function() {
"use strict";
function main() {
let ctx = new AudioContext();
fetch("/res/audio/twinkle.wav")
.then(res => res.arrayBuffer())
.then((buffer) => {
return new Promise((resolve, reject) => {
ctx.decodeAudioData(buffer, (audioBuffer) => {
resolve(audioBuffer);
});
});
})
.then((audioBuffer) => {
document.addEventListener("keydown", (e) => {
console.log(e.keyCode);
if (e.keyCode === 37) { // The "left arrow" key
let source = ctx.createBufferSource();
source.buffer = audioBuffer;
source.connect(ctx.destination);
source.start(0);
}
});
});
}
document.addEventListener("DOMContentLoaded", main);
}());