在Chrome for Android上获取音频持续时间

时间:2014-03-28 17:29:48

标签: javascript html5-audio

我正在获取文件的音频/视频持续时间,而不会将其附加到屏幕上。 “使用相同的代码”,当我尝试获取双方的视频时长时,它按预期工作。但是在使用音频文件时,它表示在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);
});

2 个答案:

答案 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
});

我不确定为什么会发生这一切。但是,让我们感到高兴的是它并不严肃。