我正在获取文件的音频/视频持续时间,而不会将其附加到屏幕上。 “使用相同的代码”,当我尝试获取双方的视频时长时,它按预期工作。但是在使用音频文件时,它表示在Android上持续时间为0 ,但它适用于台式计算机。
// Only working on Desktop
var audio = new Audio(url);
// Hide audio player
// player.appendChild(audio);
audio.addEventListener('loadedmetadata', function() {
alert(audio.duration);
});
以下代码正在运行:
// Working on Desktop and Android
var video = document.createElement('video');
video.src = url;
// Hide video
// player.appendChild(video);
video.addEventListener('loadedmetadata', function() {
alert(video.duration);
});
答案 0 :(得分:5)
您可以尝试不同的方法但是,如果持续时间不适用于您的设备(IMO是一个错误),那么它可能也不会;值得一试:
audio.seekable.end(audio.seekable.length-1);
甚至
audio.buffered.end(audio.buffered.length-1);
虽然后者依赖于正在加载的内容,但在这种情况下可能无法帮助。
答案 1 :(得分:2)
编辑:使用 durationchange 事件要容易得多。首先输出0,但是一旦加载文件( loadedmetadata 失败,我猜),将输出更新的实际持续时间。
audio.addEventListener('durationchange', function(e) {
console.log(e.target.duration); //FIRST 0, THEN REAL DURATION
});
老方式(上面更快)
看起来像这样" bug" (如果这实际上是一个真正的错误)仍然存在。 Chrome(40)for Android仍然输出0作为音频文件的持续时间。研究网络并没有给我一个解决方案,但我发现这个错误也发生在iOS上。我想我应该在这里为你们发布我的解决方案。
当 audio.duration 输出0时,记录音频输出对象,您可以看到持续时间恰好在那里显示。所有这些都发生在 loadedmetadata 事件中。
audio.addEventListener('loadedmetadata', function(e) {
console.log(e.target.duration); //0
});
如果您在 timeupdate 事件中记录audio.duration,则会输出实际持续时间。要只输出一次,只需输出:
var fix = true;
audio.addEventListener('timeupdate', function(e) {
if(fix === true) {
console.log(e.target.duration); //REAL DURATION
fix = false;
}
console.log(e.target.currentTime); //UPDATED TIME POSITION
});
我不确定为什么会发生这一切。但是,让我们感到高兴的是它并不严肃。