我昨天在这里,因为我需要解决这个完全相同的问题,当然,StackOverflow是搜索结果的顶部 - 即使是这个四岁的未解答的问题。唉我搜索本地JS的解决方案被证明无果而终,但我试图从这里有几种不同的意见,所以这里就是我最终想出了自己...
function tracksTotalLength(Tracklist) {
var tempAudio = document.createElement('audio'),
L = Tracklist.length,
i = 0, // iterator
TTL = 0, // TotalTrackLength
flag = true;
// set media-type and mute (belt and braces)
tempAudio.type = 'audio/mpeg';
tempAudio.muted = true;
tempAudio.addEventListener(
'durationchange',
function(e) {
TTL += e.target.duration;
/* DEBUG ONLY */ console.log('TTL:',TTL);
recursiveUpdater(i++);
},
false
);
function recursiveUpdater(ii) {
if (!isNaN(TTL) && ii < L) {
tempAudio.src = Tracklist[ii];
// fires recursiveUpdater()
// via 'durationchange' event
} else {
// sometimes not all values are caught
// and TTL = NaN, so
// reset and have another run at it
if (isNaN(TTL) && flag) {
i = 0;
flag = false;
recursiveUpdater(i);
} else (
// but you can't recurse all day so
// remove tempAudio
tempAudio = null;
// if it hasn't caught return false
return (!isNaN(TTL) : TTL : false);
}
}
}
return recursiveUpdater(i);
}
var tracks = [
'path/to/track01.mp3',
'path/to/track02.mp3',
'path/to/track03.mp3',
/*...etc... */
];
var totalLength = tracksTotalLength(tracks);
//=> totalLength = seconds (float) or false
tracksTotalLength()返回的总时间的函数列表以秒然后可以被舍入到为hh:mm:ss的按本经典StackOverflow answer。
在“durationchange”当元数据被加载或改变被激发。更多关于这在Media Events (MDN)
在最新的Firefox和铬的浏览器在测试了Lubuntu 14.04有5-50项tracklists。
希望这可以帮助别人,或至少鼓励真正的JS大师拿出一个更好的程序。