网络音频:让事件在确切的时刻发生?

时间:2017-01-20 08:15:50

标签: javascript web-audio

我正在尝试制作一些声音样本以一定间隔随机选择的内容,以便歌曲演变并且每次听到时都会有所不同。 HTML音频还不够,因为时机不精确,所以我正在尝试使用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);

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

2 个答案:

答案 0 :(得分:1)

WebAudio应该能够使用<div class="bg bg2"> <input type="text" placeholder="100% width - button" /><a class="button" href="#">Click</a> </div> <div class="bg"> <input type="text" placeholder="100% width" /> </div>非常精确地启动音频,直到最近的采样时间。如果它没有,那是因为来自start(time)的音频数据不包含您预期的数据,或者它是您浏览器中的错误。

答案 1 :(得分:0)

当您拨打keyPressed时,您希望触发两首歌曲以开始播放。一个立即,另一个在7.5秒。

  1. 播放歌曲的功能是soundObj.play,需要另外一个参数,即播放歌曲的audioContext时间。例如:soundObj.play = function(volumeVal, pitchVal, startTime) {...}

  2. function keyPressed()块看起来像这样:

    harp1.play(.5, 2, 0); harp2.start(1, 1, audioContext.currentTime + 7.5); audioContext.resume();

  3. audioContext.resume()启动实际的音频(或者更确切地说,启动音频图表时序,以便它按照您预定的时间进行操作)