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

Ken*_*nny 9 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);
});
Run Code Online (Sandbox Code Playgroud)

以下代码正在运行:

// 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);
});
Run Code Online (Sandbox Code Playgroud)

小智 5

您可以尝试不同的方法但是,如果持续时间不适用于您的设备(IMO是一个错误),那么它可能也不会; 虽然值得一试:

audio.seekable.end(audio.seekable.length-1);
Run Code Online (Sandbox Code Playgroud)

甚至

audio.buffered.end(audio.buffered.length-1);
Run Code Online (Sandbox Code Playgroud)

虽然后者依赖于正在加载的内容,但在这种情况下可能无济于事.


tim*_*mer 3

编辑:使用durationchange事件要容易得多。首先输出 0,但是一旦加载文件(我猜这就是loadmetadata失败的地方),就会输出更新的实际持续时间。

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



老方法(上面的方法要快得多)

看起来这个“错误”(如果这实际上是一个真正的错误)仍然存在。Android 版 Chrome (40) 仍输出 0 作为音频文件持续时间。研究网络并没有找到解决方案,但我发现这个错误也发生在 iOS 上。我想我应该在这里为你们发布我的修复程序。

audio.duration输出 0 时,记录音频输出对象,您可以看到持续时间就显示在那里。所有这些都发生在loadedmetadata事件中。

audio.addEventListener('loadedmetadata', function(e) {
    console.log(e.target.duration); //0
});
Run Code Online (Sandbox Code Playgroud)

如果您在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
});
Run Code Online (Sandbox Code Playgroud)

我不知道为什么会发生这一切。但让我们高兴的是,这并不是什么严重的事情。