У меня есть тег html5 <audio>
на странице, но как узнать его продолжительность?
<audio controls="">
<source src="p4.2.mp3">
</audio>
У меня есть тег html5 <audio>
на странице, но как узнать его продолжительность?
<audio controls="">
<source src="p4.2.mp3">
</audio>
В каком браузере вы пытаетесь это сделать? В некоторых браузерах duration
работает не так, как нужно, возвращая NaN
, как вы упомянули.
Также вы убедитесь, что аудиофайл загрузился, прежде чем пытаться получить продолжительность?
var au = document.createElement('audio');
au.addEventListener('loadedmetadata',function(){
au.setAttribute('data-time',au.duration);
},false);
В вышеприведенном комментарии было упомянуто, что решение заключается в привязке дескриптора события к метаданным, загруженным событиям. Вот как я это сделал -
audio.onloadedmetadata = function() {
alert(audio.duration);
};
Я нашел эту статью, может быть удобно.
http://neutroncreations.com/blog/building-a-custom-html5-audio-player-with-jquery/
Я использовал событие canplaythrough, чтобы получить продолжительность трека. У меня есть случай, когда у меня есть два игрока, и я хочу остановить второго игрока за 2 секунды до завершения первого.
$('#' + _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);
});
просто audioElement.duration
Dave
Решение 2018:
Вы получите undefined
или NaN
(а не число), когда звуковые метаданные еще не загружены. Поэтому некоторые люди предложили использовать onloadedmetadata
, чтобы убедиться, что сначала загружены метаданные аудиофайла. Кроме того, большинство людей не упомянули, что вам нужно настроить таргетинг на первый индекс элемента DOM аудио с помощью [0]
следующим образом:
- Vanilla Javascript:
var audio = $("#audio-1")[0];
audio.onloadedmetadata = function() {
alert(audio.duration);
};
Если это не сработает, попробуйте это, но не так надежно и зависит от подключения пользователей:
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);
});
});