0

我一直在玩 js audio web api。我想要实现的目标是循环播放一段曲目。

循环播放整首曲目没问题,但是如果我定义了一个持续时间,那么它就不再循环了......我想我需要的是一个标记而不是持续时间......如果有办法做到这一点?

const audioCtx = new AudioContext();
const srcUrl = 'https://freesound.org/data/previews/251/251248_1137749-lq.mp3';
let srcArrayBuffer;
let playingTrack;

async function loadSrcAudioFile(url) {
  const response = await fetch(url);
  const buffer = await response.arrayBuffer();

  return buffer;
}

function loop() {
  playingTrack = audioCtx.createBufferSource();

  playingTrack.connect(audioCtx.destination);

  playingTrack.buffer = srcArrayBuffer;
  
  playingTrack.loop = true;
  //playingTrack.loopStart = 0;
  //playingTrack.loopEnd = 1.5;
  
  playingTrack.start(audioCtx.currentTime, 0, 1.5);
}

function stop() {
  playingTrack.stop();
  playingTrack = null;
}

async function play() {
    if (!srcArrayBuffer) {
      const buffer = await loadSrcAudioFile(srcUrl);

      srcArrayBuffer = await audioCtx.decodeAudioData(buffer);
  }

  loop();
}

document.getElementById('playBtn').addEventListener('click', play);
document.getElementById('stopBtn').addEventListener('click', stop);

JSFIDDLE

4

1 回答 1

1

您快到了。设置持续时间意味着“玩这么久”。无论如何,它会在 1.5 秒后停止。它不关心缓冲区是否被循环。

设置loopStart并且loopEnd不指定持续时间就可以了。

https://jsfiddle.net/4yeavmp3/

例如,如果您想循环 4 次,您可以将持续时间设置为 6。

于 2021-07-26T09:37:26.340 回答