audio.duration

时间:2017-11-18 19:48:28

标签: javascript jquery

我尝试通过音频异步读取一个句子数组;但是我想在读取另一个句子之前等待当前音频的持续时间。 我在音频持续时间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);

});
}

2 个答案:

答案 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);