javascript - 网络音频 : Make event occur at exact moment?

标签 javascript web-audio-api

我正在尝试制作一些声音样本,每隔一定时间随机选择声音样本,以便歌曲不断发展,并且每次听时都会有所不同。 HTML Audio 对此还不够,因为时间不精确,所以我正在尝试 Web Audio,但它似乎相当复杂。现在,我只想知道如何让新的音频文件精确地在 16 秒或 32 秒等处播放。我遇到过这样的事情

playSound.start(audioContext.currentTime + numb);

但到目前为止我还无法让它发挥作用。

var audioContext = new audioContextCheck();

function audioFileLoader(fileDirectory) {
  var soundObj = {};
  soundObj.fileDirectory = fileDirectory;

  var getSound = new XMLHttpRequest();
  getSound.open("GET", soundObj.fileDirectory, true);
  getSound.responseType = "arraybuffer";
  getSound.onload = function() {
    audioContext.decodeAudioData(getSound.response, function(buffer) {
      soundObj.soundToPlay = buffer;
    });
  }

  getSound.send();

  soundObj.play = function(volumeVal, pitchVal) {
    var volume = audioContext.createGain();
    volume.gain.value = volumeVal;
    var playSound = audioContext.createBufferSource();
    playSound.playbackRate.value = pitchVal;
    playSound.buffer = soundObj.soundToPlay;
    playSound.connect(volume);
    volume.connect(audioContext.destination)
    playSound.start(audioContext.currentTime)
  }

  return soundObj;
};

var harp1 = audioFileLoader("IRELAND/harp1.ogg");
var harp2 = audioFileLoader("IRELAND/harp2.ogg");

function keyPressed() {
  harp1.play(.5, 2);
  harp2.start(audioContext.currentTime + 7.5);
}

window.addEventListener("keydown", keyPressed, false);

你看,我正在尝试让 harp2.ogg 在 harp1.ogg 完成后立即播放。最终我希望能够随机选择下一个文件,但现在我只需要知道如何实现它。如何让 harp2.ogg 在 harp1.ogg 开始后 7.5 秒准确播放(或者更好的是,有没有办法在 harp2 结束时触发它(没有音频间隙)?)感谢帮助,谢谢!

最佳答案

WebAudio 应该能够使用 start(time) 非常精确地启动音频,精确到最近的采样时间。如果没有,这是因为 decodeAudioData 中的音频数据不包含您期望的数据,或者是您的浏览器中的错误。

关于javascript - 网络音频 : Make event occur at exact moment?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41758946/

相关文章:

javascript - iOS 13 捕获(录音)停止后无法播放音频(Web Audio API)

linux - Web Audio Api 目标 maxChannelCount 在 Linux 上始终为 2

javascript - 将图像粘贴到 TinyMCE 编辑器中

javascript - 如何回到 Ionic 4

javascript - 如何在javascript中用ID替换名称

javascript - 排除正则表达式模式中仅由制表符组成的空格

javascript - 如何在 js 文件中使用脚本参数?

javascript - html5/javascript 音频同时播放多首轨道

javascript - 将 PCM 流转换为 Javascript 可读流

javascript - Offlineaudiocontext.resume() 在移动 Safari 上不会触发