我尝试通过音频异步读取一个句子数组;但是我想在读取另一个句子之前等待当前音频的持续时间。
我在音频持续时间settimeout
期间尝试onloadmetadata
,但它不起作用。我认为audio.duration仅在onloadedmetadata
中起作用。当我调试时,我在onloadedmetadata和NaN
中获得了正确的持续时间
这就是我所做的。
请原谅我的英文
var j = 0, texte = "";
function listen(callback) {
var sentence = texte[j];
if (j < texte.length) {
j++;
} else {
j = 0;
texte = "";
return;
}
callback(sentence, listen);
}
function play (sentence, callback) {
// Play the received speech
googleTTS(sentence, 'fr', 1) // speed normal = 1 (default), slow = 0.24
.then(function (url) {
console.log(url); // https://translate.google.com/translate_tts?...
var audio = new Audio(url);
var duration;
audio.onloadedmetadata = function(){
duration = audio.duration;
}
audio.play();
setTimeout(function(){
callback(play);
}, duration);
});
}
答案 0 :(得分:2)
尝试向ended
对象添加audio
事件处理程序:
audio.addEventListener('ended', function() {
callback(play);
});
audio.play();
当前音频播放完毕后会触发此事件。
答案 1 :(得分:0)
foldr
可能暂停加载元数据。这就是回调存在的原因。因此,在您调用audio.play()
之前,不会设置持续时间。
而不是
setTimeout
尝试
var duration;
audio.onloadedmetadata = function(){
duration = audio.duration;
}
audio.play();
setTimeout(function(){
callback(play);
}, duration);