Javascript 在连接到web audio api的音频元素上设置播放速率

Javascript 在连接到web audio api的音频元素上设置播放速率,javascript,html,html5-audio,web-audio-api,Javascript,Html,Html5 Audio,Web Audio Api,我一直在尝试使用createMediaElementSource将音频元素连接到web音频api,并使其正常工作,但我需要做的一件事是更改音频标记的播放速率,但我无法使其正常工作 如果您尝试运行下面的代码,您将看到它一直工作,直到您取消注释我们设置播放速率的行。当这一行在音频中时,将被静音 我知道我可以使用source.playbackRate.value设置AudioBufferSourceNode上的播放速率,但这不是我想要做的,我需要在audio元素连接到web audio api时使用c

我一直在尝试使用createMediaElementSource将音频元素连接到web音频api,并使其正常工作,但我需要做的一件事是更改音频标记的播放速率,但我无法使其正常工作

如果您尝试运行下面的代码,您将看到它一直工作,直到您取消注释我们设置播放速率的行。当这一行在音频中时,将被静音

我知道我可以使用source.playbackRate.value设置AudioBufferSourceNode上的播放速率,但这不是我想要做的,我需要在audio元素连接到web audio api时使用createMediaElementSource设置播放速率,这样我就没有任何AudioBufferSourceNode

有人做到了吗

var _source,
     _audio,
     _context,
     _gainNode;

_context = new webkitAudioContext();

function play(url) {
    if (_audio) {
        _audio.pause();
    }
    _audio = new Audio(url);
    //_audio.playbackRate = 0.6;

    setTimeout(function() {
        if (!_gainNode) {
            _gainNode = _context.createGainNode();
            _gainNode.gain.value = 0.1;
            _gainNode.connect(_context.destination);
        }

        _source = _context.createMediaElementSource(_audio);
        _source.connect(_gainNode);

        _audio.play();
    }, 0);

}

play("http://geo-samples.beatport.com/items/volumes/volume2/items/3000000/200000/40000/9000/400/60/3249465.LOFI.mp3");

setTimeout(function () {
    _audio.pause();
}, 4000);

您使用哪个浏览器来测试此功能?这似乎还没有在Firefox中实现,但应该在Chrome上实现

用于实现播放速率的Mozilla错误:

您必须在音频开始播放后设置播放速率。我发现的唯一可移植的方法是等待获得一个带有有效
currentTime
timeupdate
事件:

_audio.addEventListener('timeupdate', function(){
    _if(!isNaN(audio.currentTime)) {
        _audio.playbackRate = 0.6;
    }
});

请注意,android当前不支持播放速率,Chrome(桌面)不支持低于0.5的播放速率。

我使用的是Chrome。Firefox支持音频标签,但不支持web音频api,我的代码使用了这两种技术,因此不会在Firefox上运行。在chrome中,playbackRate可以在独立的音频标签上运行,但我尝试在使用createMediaElementSource连接到web音频api的音频元素上运行。这是我无法工作的部分。奇怪的是,这在Chrome中似乎对我有效。-Chrome:22.0.1229.94版本这在Safari中仍然是一个问题(至少是v13.0.0,但可能更早);Chrome/Firefox工作正常。连接节点后,无法再在上设置音量和播放速率。对于音量,连接a,正如您已经提到的,对于播放速率,连接a。这似乎是一个bug。规范中的哪一项规定了音频的播放速率在初次播放后才能设置?当我阅读规范()时,意图是播放开始后,
defaultPlaybackRate
将(重新)设置
playbackRate
。此后,可以使用
playbackRate
动态设置播放速率。必须像我上面写的那样去做有点奇怪,但是,唉,这是唯一有效的方法。相信我:)(我现在是的作者,在这个问题上花了大约40个小时。)设置呢?我并不是说你在播放后必须设置它是错误的。我只是不明白为什么会这样。浏览器应该能够抽象出该要求,规范应该将责任推给浏览器供应商。规范提到浏览器可以向用户公开视觉控件,浏览器可以让用户更改播放速率。首先,让浏览器公开特定于浏览器的控制界面是一个非常糟糕的想法,但这就是规范的措辞。我认为与此接口的交互决定了需要同时具有
playbackRate
defaultPlaybackRate