JS获取音频的总时长,解决audio.duration 为 NaN || Infinity 问题

博客讲述了在前端开发中遇到的使用`<audio>`标签播放音频时无法显示时长及获取总时长为NaN或Infinity的问题。作者提出通过预加载并模拟快进的方式来快速获取音频时长的解决方案,提供了相关代码示例,以实现自定义播放器的需求。
摘要由CSDN通过智能技术生成


一、需求分析

后端的接口中包含音频链接,前端需要自定义一个播放器播放音频。


二、发现问题

1.使用浏览器内置播放器<audio>无法显示时长

Chrome && Edge:播放到一定时间后才能移动进度条与显示时长

Chrome默认状态播放时播放快结束时
在这里插入图片描述在这里插入图片描述在这里插入图片描述

Firefox:直接可以看到进度条与时长,样子也好看,问题解决(bushi)

Firefox默认状态播放时播放快结束时
在这里插入图片描述在这里插入图片描述在这里插入图片描述

2.获取总时长为 NaN || Infinity

audio.ontimeupdate = () => {
	console.log(`currentTime: ${audio.currentTime} , duration: ${audio.duration}`)
}

根据输出可以看到只有在快接近播放完毕时才能获取到时间。

由此可以想到一个办法,预加载!直接先播放一遍获取时长!

在这里插入图片描述


三、疑惑点

问:使用预加载方案,如果单纯的将音频播放一遍在获取总时长不太妙,时间太久了捏。

答:结合生活实际,想想你看片时想快速结束时会怎么做?

问:噢,快进!


四、解决方案

示例代码,可根据自己的需要更改方案,主要看countAudioTime函数即可。

这种方案能很快的获取出音频的时间,然后就可以愉快的自定义播放器啦~ 有问题欢迎指出~

const audio = new Audio()
audio.src = 'https://www.千度.com/audio/JiNiTaiMei.mp3'

// 计算音频的时长
const countAudioTime = async () => {
  while (isNaN(audio.duration) || audio.duration === Infinity) {
    // 延迟一会 不然网页都卡死
    await new Promise(resolve => setTimeout(resolve, 200));
    // 设置随机播放时间,模拟调进度条
    audio.currentTime = 10000000 * Math.random();
  }
  console.log('音频的总时长:',audio.duration)
}
countAudioTime()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

holden丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值