设置持续时间后,AudioBufferSourceNode 不循环

AudioBufferSourceNode not looping when duration is set

我一直在玩 js 音频网络 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

你快到了。设置持续时间意味着“播放这个时间”。无论如何它都会在 1.5 秒后停止。它不关心缓冲区是否循环。

设置 loopStartloopEnd 而不指定持续时间即可。

https://jsfiddle.net/4yeavmp3/

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