【问题标题】:AudioBufferSourceNode not looping when duration is set设置持续时间时 AudioBufferSourceNode 不循环
【发布时间】:2021-10-02 05:43:18
【问题描述】:

我一直在玩 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

【问题讨论】:

    标签: audio html5-audio web-audio-api audiocontext audiobuffer


    【解决方案1】:

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

    在不指定持续时间的情况下设置 loopStartloopEnd 即可。

    https://jsfiddle.net/4yeavmp3/

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

    【讨论】:

    • 谢谢!这确实有效!我在创建这篇文章之前尝试过,但没有成功,因为我仍在将持续时间传递给 start 方法......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 2017-12-18
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多