【问题标题】:Web audio api audio file abstraction only recognizes the scheduled time on initial playback. It then plays back immediatelyWeb audio api 音频文件抽象仅识别初始播放时的预定时间。然后立即播放
【发布时间】:2014-05-12 22:48:53
【问题描述】:

以下代码的目标是确保每次触发事件侦听器时,声音都会在 2 秒后播放。就目前而言,这仅在第一次触发事件时有效。所有后续的 mousedown 事件都会立即播放文件。我正在寻找有关如何解决此问题的提示。

var audioContext = new webkitAudioContext;

function AudioObj(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(time) {
        var playSound = audioContext.createBufferSource();
        playSound.buffer = soundObj.soundToPlay;
        playSound.connect(audioContext.destination);
        playSound.start(time );

      }

      return soundObj;

}


var snare = AudioObj("snare.mp3");

window.addEventListener("mousedown", go);

function go(){
    snare.play(2)
}

【问题讨论】:

    标签: javascript web-audio-api


    【解决方案1】:

    开始时间不是偏移量。你需要调用 play sound.start(AudioContext.currentTime + time);在你的 play() 方法中。

    【讨论】:

    • 谢谢。我能问一下第一次使用预定时间值的实现背后的逻辑是什么吗?我的意思是我不应该总是写 audioContext.currentTime + (scheduled sound event) 吗?第一次在没有完整代码行的情况下工作的原因是什么?
    • @TaoistWA 在您使用 webkit 时,仍然存在一个错误,即当您创建第一个节点时 context.currentTime 开始计数。因此,当您单击创建节点时,时间开始,然后与 currentTime 的偏移量确实为 ~2s。
    • 您回避的问题是绝对正确的,并且是一个 webkit 问题,但关于我向 Chris 提出的问题 - 我刚刚在 Firefox Aurora 中进行了测试,它也做了同样的事情。所以我不认为 webkit 错误是相关的。
    • 首次创建音频上下文时,音频上下文时间从零开始 - 如果您立即创建节点并使用 start(2) 启动第一个节点,它将在两秒后开始。
    • (正如 MarijnS95 所指出的,Webkit/Blink 仍然存在一个错误,即在创建第一个节点之前时间不会开始计时。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 2017-08-15
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多