2012-06-26 16 views

Respuesta

12

Qué navegador está tratando esto? En algunos navegadores, duration no funciona como debería, devolviendo NaN como mencionó.

¿También se asegura de que el archivo de audio se haya cargado antes de intentar recuperar la duración?

+17

Lo he resuelto, ato un identificador de evento al evento 'loadedmetadata', en este caso podría obtener la propiedad' duration' – hh54188

+0

Esa sería mi sugerencia en función de su respuesta aquí, pero me alegro de ver que se imaginó ¡por ti mismo! –

0

simplemente audioElement.duration

de Dave

+4

No, no funciona, lo intenté: 'var audio = $ ('# audio') [0]; console.log ('audio', audio.duration); 'pero el resultado es' NaN' – hh54188

+0

Esto le da la duración correcta (probado en Firefox), pero solo después de que se haya producido el evento loadedmetadata. –

+0

Parece que funciona cuando usa 'setTimeout (function() {...}, 10);' en lugar de ejecutarlo de inmediato. – AlexioVay

8
var au = document.createElement('audio'); 
au.addEventListener('loadedmetadata',function(){ 
    au.setAttribute('data-time',au.duration); 
},false); 
+0

solo Chrome no funciona IE = / –

6

En un comentario anterior, se mencionó que la solución es vincular un identificador de evento al evento loadedmetadata. Así es como lo hice -

audio.onloadedmetadata = function() { 
    alert(audio.duration); 
}; 
1

He utilizado el evento "canplaythrough" para obtener la duración de la pista. Tengo un caso en el que tengo dos jugadores, y quiero detener al segundo jugador 2 segundos antes de que termine el primero.

$('#' + _currentPlayerID).on("canplaythrough", function (e) { 
    var seconds = e.currentTarget.duration;  
    var trackmills = seconds * 1000; 
    var subTimeout = trackmills - 2000; //2 seconds before end 

    //console.log('seconds ' + seconds); 
    //console.log('trackmills ' + trackmills); 
    //console.log('subTimeout ' + subTimeout); 

    //Stop playing before the end of thet track 
    //clear this event in the Pause Event 
    _player2TimeoutEvent = setTimeout(function() { pausePlayer2(); }, subTimeout); 

}); 
1

2018 solución:

Usted recibirá undefined o NaN (no un número) cuando los metadatos de audio no se ha cargado todavía. Por lo tanto, algunas personas sugirieron usar onloadedmetadata para asegurarse de que los metadatos del archivo de audio se busquen primero. Además, lo que la mayoría de la gente no mencionaron es que usted tiene que apuntar el primer índice del elemento DOM audio con [0] así:

- Vainilla Javascript:

var audio = $("#audio-1")[0]; 
audio.onloadedmetadata = function() { 
    alert(audio.duration); 
}; 

Si esto no funcionará probar esto, sin embargo no es tan fiable y dependiente de la conexión de los usuarios:

setTimeout(function() { 
    var audio = $("#audio-1")[0]; 
    console.log("audio", audio.duration); 
}, 100); 

- jQuery:

$(document).ready(function() { 
    var audio = $("#audio-1")[0]; 
    $("#audio-1").on("loadedmetadata", function() { 
     alert(audio.duration); 
    }); 
});