在Chrome上获得音频持续时间为Android

Get audio duration on Chrome for Android

本文关键字:持续时间 Android 音频 Chrome      更新时间:2023-09-26

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

你可以尝试一种不同的方法,但如果持续时间不适用于你的设备(在我看来这是一个bug),那么它很可能也不适用;不过值得一试:

audio.seekable.end(audio.seekable.length-1);

或者

audio.buffered.end(audio.buffered.length-1);

尽管后者依赖于所加载的内容,但在这种情况下可能没有帮助

EDIT:使用durationchange事件要容易得多。首先输出0,但是一旦文件被加载(我猜这就是 loaddmetadata 失败的地方),更新的和真实的持续时间将被输出。

audio.addEventListener('durationchange', function(e) {
    console.log(e.target.duration); //FIRST 0, THEN REAL DURATION
});



老方法(以上方法更快)

看起来这个"bug"(如果这真的是一个bug的话)仍然存在。Chrome(40)为Android仍然输出0作为音频文件的持续时间。在网上搜索没有找到解决方案,但我发现这个漏洞也出现在iOS上。我想我应该把我的修复在这里给你们。

<我>音频。Duration 输出0,logging audio输出对象,您可以看到持续时间就显示在那里。所有这些都发生在 loaddmetadata 事件中。

audio.addEventListener('loadedmetadata', function(e) {
    console.log(e.target.duration); //0
});

如果您记录音频。虽然timeupdate事件中的持续时间,但实际的持续时间正在输出。如果要只输出一次,可以这样做:

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

我不知道为什么会发生这一切。但让我们高兴的是,没什么大不了的。