javascript html音频标签,持续时间始终为无穷大

kpbwa7wx  于 2023-01-24  发布在  Java
关注(0)|答案(7)|浏览(185)

我一直在使用html音频标签来播放一些音频文件。音频播放正常,但音频标签的持续时间属性总是返回无穷大。
我尝试了this问题的公认答案,但结果相同。用Chrome,IE和Firefox测试。
这是音频标签的错误,还是我错过了什么?
我用来播放音频文件的一些代码。
javascript函数当播放按钮是按下

function playPlayerV2(src) {
document.getElementById("audioplayerV2").addEventListener("loadedmetadata", function      (_event) {
console.log(player.duration);
});
var player = document.getElementById("audioplayer");

    player.src = "source";
    player.load();
    player.play();
}

html中音频标签

<audio controls="true" id="audioplayerV2" style="display: none;" preload="auto">

注:我隐藏了标准的音频播放器,目的是使用自定义布局,并通过javascript使用播放器,这似乎与我的问题无关。

slmsl1lt

slmsl1lt1#

试试这个

var getDuration = function (url, next) {
    var _player = new Audio(url);
    _player.addEventListener("durationchange", function (e) {
        if (this.duration!=Infinity) {
           var duration = this.duration
           _player.remove();
           next(duration);
        };
    }, false);      
    _player.load();
    _player.currentTime = 24*60*60; //fake big time
    _player.volume = 0;
    _player.play();
    //waiting...
};

getDuration ('/path/to/audio/file', function (duration) {
    console.log(duration);
});
u5i3ibmn

u5i3ibmn2#

我认为这是由于chrome bug造成的。在修复之前:

if (video.duration === Infinity) {
    video.currentTime = 10000000;
    setTimeout(() => {
        video.currentTime = 0; // to reset the time, so it starts at the beginning
    }, 1000);
}
let duration = video.duration;
bpsygsoo

bpsygsoo3#

这对我有用

const audio = document.getElementById("audioplayer");

audio.addEventListener('loadedmetadata', () => {
  if (audio.duration === Infinity) {
    audio.currentTime = 1e101
    audio.addEventListener('timeupdate', getDuration)
  }
})

function getDuration() {
  audio.currentTime = 0
  this.voice.removeEventListener('timeupdate', getDuration)
  console.log(audio.duration)
},
9o685dep

9o685dep4#

如果您控制服务器,并可以使其发送适当的媒体头-这是什么帮助OP。
我遇到了这个问题与文件存储在谷歌驱动器时,让他们在移动的版本的Chrome浏览器。我不能控制谷歌驱动器的React,我必须以某种方式处理它。
我还没有一个能让我满意的解决方案,但我尝试了两个答案中的想法--基本上是一样的:创建音频/视频对象来寻找资源的真实的结束位置。当Chrome找到真正的结束位置后-它会给你持续时间。但是结果并不令人满意。
这个黑客真正做的是--它强迫Chrome将资源完全地加载到内存中。所以,如果资源太大,或者连接太慢,你最终会在幕后等待很长时间才能下载文件。而且你无法控制那个文件--它是由Chrome处理的,一旦它决定不再需要它--它就会处理掉它。因此带宽可能被低效地使用。
因此,如果您可以自己加载文件-最好下载它(例如,作为blob)并将其馈送到您的音频/视频控件。

uyto3xhc

uyto3xhc5#

如果这是一个Twilio的mp3,尝试.wav版本。mp3是作为一个流来,它愚弄了音频播放器。
要使用.wav版本,只需将源URL的格式从.mp3更改为.wav(或者将其保留,默认为wav)
注意-wav文件是4倍大,所以这是不利的切换。

pbpqsu0x

pbpqsu0x6#

这不是一个直接的答案,但如果有人使用blob来这里,我设法使用一个名为webm-duration-fix的包修复它

import fixWebmDuration from "webm-duration-fix";

...

 fixedBlob = await fixWebmDuration(blob);

...
x6h2sr28

x6h2sr287#

//如果要完整修改视频文件,可以使用“webmFixDuration”包。其他方法仅在显示级别应用于video标签。使用此方法,可以修改整个视频文件
webmFixDuration github示例

mediaRecorder.onstop = async () => {
        const duration = Date.now() - startTime;
        const buggyBlob = new Blob(mediaParts, { type: 'video/webm' });
    
        const fixedBlob = await webmFixDuration(buggyBlob, duration);
        displayResult(fixedBlob);
      };

相关问题