2017-06-17 2 views
1

Accès à un élément audio HTML5 (fichier .ogg) avec JavaScript dans Chrome. Le fichier est lu correctement, mais il ne reconnaît pas la durée.Renvois de durée audio NaN

Je viens cribbed ce code: https://www.w3schools.com/jsref/prop_audio_duration.asp (Je sais que W3Schools est pas grand, mais il semble que quelque chose est le problème ...)

var x = document.getElementById("testTone").duration; 
console.log("duration:"+x); // duration:NaN 

var y = document.getElementById("testTone"); 
y.play(); // works! 

l'élément ...

<audio controls id="testTone"> 
    <source src="autoharp/tone0.ogg" type="audio/ogg"> 
</audio> 
+0

à quoi ressemble votre 'html'? – Aravind

+1

parce que 'audio' a besoin de temps pour charger et il n'est pas prêt quand vous appelez' .duration' –

+0

@Aravind ajouté ci-dessus ... –

Répondre

2

Ajouter preload="metadata" à votre tag pour avoir demandé les métadonnées de votre objet audio:

<audio controls id="testTone" preload="metadata"> 
    <source src="autoharp/tone0.ogg" type="audio/ogg"> 
</audio> 

Dans votre code, liez un gestionnaire d'événements, pour définir la durée lorsque le metadata has been loaded:

var au = document.getElementById("testTone"); 
au.onloadedmetadata = function() { 
    console.log(au.duration) 
}; 
+0

REF: https://www.stevesouders.com/blog/2013/04/12/ html5-video-preload/ 'preload = 'metadata' " Indique à l'UA que l'utilisateur ne devrait pas avoir besoin de la vidéo, mais qu'il récupère ses métadonnées (dimensions, première image, liste de pistes, durée, etc.) est souhaitable. "' –

+0

bon un + 1 pour vous –

+0

Merci! Je suis encore en train d'étudier ça, ça aide. Le chargement de la page a clairement des complexités que j'ai besoin de mieux comprendre. Une question: après le commentaire que l'audio avait besoin de temps pour se charger, j'ai essayé d'encapsuler mon code original avec une fonction (jQuery) document.ready ... ne fonctionnait pas. Pouvez-vous expliquer pourquoi pas? –

0

côté @ solution de FrankerZ, vous pouvez également effectuer les opérations suivantes:

<audio controls id="testTone"> 
 
    <source src="https://www.w3schools.com/jsref/horse.ogg" type="audio/ogg"> 
 
    <source src="https://www.w3schools.com/jsref/horse.mp3" type="audio/mpeg"> 
 
</audio> 
 

 
<button onclick="myFunction()">Try it</button> 
 

 
<script> 
 
    function myFunction() { 
 
    var x = document.getElementById("testTone").duration; 
 
    console.log("duration:" + x); // duration:NaN 
 

 
    var y = document.getElementById("testTone"); 
 
    y.play(); // works! 
 
    } 
 
</script>

+0

Est-ce une manière obscure d'expliquer le problème avec w3schools? Une approche directe serait mieux ... –

+0

@GregoryTippett dans votre code, la source n'est pas valide aussi bien. –

+0

@GregoryTippett 'preload = 'metadata'' est une approche plus récente TBO: D –