javascript - 播放 html5 的 Audio 对象的多个实例

标签 javascript html audio

我正在用 Javascript 制作一个小游戏,它需要一些音频以获得更好的用户体验。 我遇到的主要问题是我必须多次播放一首歌曲/声音,有时是同时播放。 但是,如果我 cloneNode 音频对象,音频会从服务器再下载一次,因此只能在后面播放,因为必须先下载。所以在正常游戏中声音可以下载超过100次!

因为我在网上找不到答案,所以我问你:)

请注意,我想用我自己的代码而不是库来做到这一点。

最佳答案

使用 new Audio()/HTMLAudioElement.play 的解决方案适用于音乐之类的内容,但不允许同时播放同一音频的多个副本。对于音效,正确使用的工具是 AudioBuffer。来自 Web Audio API .举个简单的例子:

const playButton = document.getElementById('play');

let interval = null;

playButton.addEventListener('click', async () => {
  // if already started playback, just stop it
  if (interval !== null) {
    clearInterval(interval);
    interval = null;
    return;
  }

  // create an audio context
  const audioCtx = new AudioContext();
  
  // fetch a sound effect, and get an ArrayBuffer
  const resp = await fetch('https://upload.wikimedia.org/wikipedia/commons/6/68/Crash.ogg');
  const arrayBuffer = await resp.arrayBuffer();
  
  // decode the ArrayBuffer into an AudioBuffer
  const audioBuffer = await audioCtx.decodeAudioData(arrayBuffer);
  
  // set an interval for every 250ms
  interval = setInterval(() => {
    // create an AudioBufferSourceNode
    const source = audioCtx.createBufferSource();
    
    // set the AudioBuffer
    source.buffer = audioBuffer;
    
    // connect it to the default sound output
    source.connect(audioCtx.destination);
    
    // start playback
    source.start();
  }, 250);
});
<button id="play">Play</button>

关于javascript - 播放 html5 的 Audio 对象的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4728352/

相关文章:

javascript - 强制 IE 到 'redraw' 一个带有 JavaScript 的元素来修复 CSS 错误?

html - 如何在 HTML/CSS 中设置百分比高度值

javascript - 循环内声明的变量保留先前的值

javascript - 在 CSS 中使用一个 before 伪选择器来在一行中显示有关多个元素的信息

javascript - 我想如果有 2 个元素具有相同的文本,一个在 jquery 中被删除

matlab - 从 wav 文件中去除噪声,MATLAB

cocoa-touch - 播放时如何处理ipod库音频文件原始数据

html - safari 不播放 .ogg 文件,那么它在 wiktionary.org 上如何工作?

javascript - 我可以修改本地 JavaScript 对象吗?

javascript - 如何在 Bridge.net C# 的事件中获取 Html 对象?