javascript - 通过 JS 重叠播放音频

标签 javascript html audio html5-canvas game-engine

我有以下基于 Canvas 的游戏的 JS 代码。

var EXPLOSION = "sounds/explosion.wav";

function playSound(str, vol) {
  var snd = new Audio();
  snd.src = str;
  snd.volume = vol;
  snd.play();
}

function createExplosion() {
  playSound(EXPLOSION, 0.5);
}

这是可行的,但是它会在每次调用时发送一个服务器请求来下载声音文件。或者,如果我事先声明音频对象:

var snd = new Audio();
snd.src = EXPLOSION;
snd.volume = 0.5;

function createExplosion() {
  snd.play();
}

这是可行的,但是如果在声音播放完毕之前调用 createExplosion 函数,它根本不会播放声音。这意味着一次只允许播放一次声音文件 - 在发生多次爆炸的情况下它根本不起作用。

有什么方法可以正确播放多次与自身重叠的音频文件?

最佳答案

您可以使用 cloneNode()play() 复制节点。

我的音频元素看起来像这样:

<audio id="knight-audio" src="knight.ogg" preload="auto"></audio>

我有一个 onClick 监听器可以做到这一点:

function click() {
    const origAudio = document.getElementById("knight-audio");
    const newAudio = origAudio.cloneNode()
    newAudio.play()
}

并且由于不会显示 audio 元素,因此您实际上不必将节点附加到任何东西。

我验证了客户端和服务器端,Chrome 只尝试下载一次音频文件。

注意事项:我不确定对性能的影响,因为在我的网站上,此剪辑在一个页面上播放的最大值不会超过 ~40 倍。如果您正在做比这大得多的事情,您可能必须清理音频节点?

关于javascript - 通过 JS 重叠播放音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15125528/

相关文章:

python - 使用 Python 播放音频

audio - 声音乘法的效果

javascript - 部署到 heroku(gulp 未找到错误)

iphone - 在phonegap中重定向页面

html - 为了让 Pelican 生成的 html 链接到图像,表达路径的正确方法是什么?

html - 基础菜单溢出手机

.net - VB.NET(2008)播放声音

javascript - 如何隐藏真实的图像路径(或撤销访问权限)?

javascript - 如何在具有多个变量的模板文字中使用三元运算符

javascript - 无法在 beforeunload 事件上重置 Widow