Javascript 在连接到web audio api的音频元素上设置播放速率
我一直在尝试使用createMediaElementSource将音频元素连接到web音频api,并使其正常工作,但我需要做的一件事是更改音频标记的播放速率,但我无法使其正常工作 如果您尝试运行下面的代码,您将看到它一直工作,直到您取消注释我们设置播放速率的行。当这一行在音频中时,将被静音 我知道我可以使用source.playbackRate.value设置AudioBufferSourceNode上的播放速率,但这不是我想要做的,我需要在audio元素连接到web audio api时使用createMediaElementSource设置播放速率,这样我就没有任何AudioBufferSourceNode 有人做到了吗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
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
。