【问题标题】:Get audio duration on Chrome for Android在 Android 版 Chrome 上获取音频时长
【发布时间】:2015-03-26 03:46:33
【问题描述】:

我在没有将文件附加到屏幕的情况下获取文件的音频/视频持续时间。 “使用相同的代码”,当我尝试获取双方的视频持续时间时,它按预期工作。但是当使用音频文件时,它会说 持续时间为 0 在 Android 上,但它可以在台式计算机上运行。

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

【问题讨论】:

  • 您尝试播放音频/视频,还是这样?手机不像台式机那样预加载,但 preload=all 属性可能会有所帮助。在带有控件的音频上点击“播放”后,一旦加载的元数据触发,您应该能够获得持续时间。
  • @dandavis 它正在工作。这将是一个错误,因为两个月前相同的代码不起作用。谢谢。

标签: javascript html5-audio


【解决方案1】:

您可以尝试另一种方法,但是,如果持续时间不适用于您的设备(IMO 是一个错误),那么这很可能也不行;不过值得一试:

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

甚至

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

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

【讨论】:

  • 在桌面上工作,但不幸的是不能在 Android 上工作(在 Chrome for Android 版本 35 上测试)。谢谢。
  • @honzzz 你的代码对吗?我的现在运行良好。 github.com/miguelripoll/Cast/blob/master/www/scripts/…
  • @PhilDunphy23 - 你是说它适用于 Android 版 Chrome 吗?您使用的是哪个版本的 Android?
【解决方案2】:

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

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



旧方法(上面要快得多)

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

audio.duration 输出 0 时,记录 audio 输出对象,您可以看到持续时间正好显示在那里。所有这些都发生在 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
});

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

【讨论】:

    猜你喜欢
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 2015-10-13
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多