JS获取音频的总时长,解决Audio元素duration为NaN || Infinity 问题

简介: JS获取音频的总时长,解决Audio元素duration为NaN || Infinity 问题

当我们在加载一个线上mp3地址或者获取audio的duration的时候,会发现有拿到duration是Infinity的情况,这时如果我们动态的展示录音时间时候就会有问题。首先明确一下这是chrome浏览器自己的存在的一个bug,因为我们拿到的录音数据流没有定义长度,所以浏览器无法解析出当前音频的时长。

一、发现问题

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

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

Firefox:直接可以看到进度条与时长

继续往下,解决Chrome中的问题

二、获取总时长为 NaN || Infinity

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

根据输出结果发现,只有播放一段时间,或者开始播放的时候才会拿到总时长,但这并不是我们想要的。初始化的时候就想拿到总时长

三、解决方案

预加载!直接先播放一遍获取时长!

// node为audio标签的dom元素 
export const formatePlayerDuration = (node: any) => {
  node.onloadedmetadata = (e: any) => {
    const audio = e.target;
    const audioDuration = audio.duration;
    if (audioDuration === Infinity) {
      audio.currentTime = 1e101;
      audio.ontimeupdate = () => {
        audio.ontimeupdate = () => { return; };
        // 不重新设置currtTime,会直接触发audio的ended事件,因为之前将currentTime设置成了一个比音频时长还大的值。所以要将currentTime重置为初始状态。
        // 注: 这里有一个问题,直接设置为0 是不起作用的。需要重新设置一下audio.currentTime = 1e101;然后再设置为
        audio.currentTime = 1e101;
        audio.currentTime = 0;
      }
    }
  }
}

问题解决!!!!!!!

audio标签

<audio src='mp3地址' class="xxx" controls controlsList="nodownload noplaybackrate" preload="auto"></audio>

尝试了一种setTimeout的方法,也可以解决,但是页面时间部分会出现时间闪烁的情况,所以就不考虑了,代码贴出来

const audio = new Audio()
audio.src = 'https://www.xx.com/audio/xx.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()



相关文章
|
7天前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
19天前
|
JavaScript 前端开发 开发者
.js的dom元素操作
【10月更文挑战第29天】通过灵活运用这些 DOM 元素操作方法,JavaScript 可以实现丰富的网页交互效果,如动态更新页面内容、响应用户操作、创建和删除页面元素等。在实际开发中,开发者可以根据具体的需求和场景,选择合适的 DOM 元素操作方法来实现所需的功能,为用户提供更加流畅和动态的网页体验。
|
1月前
|
移动开发 JavaScript 前端开发
原生js如何获取dom元素的自定义属性
原生js如何获取dom元素的自定义属性
62 4
|
2月前
|
存储 前端开发 JavaScript
前端基础(二)_JavaScript变量、JavaScript标识符、JavaScript获取元素、JavaScript的鼠标事件
本文介绍了JavaScript变量的声明和使用、标识符的命名规则、如何获取和操作HTML元素,以及JavaScript的鼠标事件处理,通过示例代码展示了这些基础知识点在实际开发中的应用。
43 2
前端基础(二)_JavaScript变量、JavaScript标识符、JavaScript获取元素、JavaScript的鼠标事件
|
1月前
|
JavaScript
js删除数组中已知下标的元素
js删除数组中已知下标的元素
37 4
|
1月前
|
JavaScript 前端开发 索引
JS 删除数组元素( 5种方法 )
JS 删除数组元素( 5种方法 )
43 1
|
2月前
|
JavaScript 前端开发
JavaScript HTML DOM 元素 (节点)
JavaScript HTML DOM 元素 (节点)
28 2
|
2月前
|
JavaScript 前端开发
js删除数组最后一个元素
js删除数组最后一个元素
|
2月前
|
JavaScript 前端开发
js怎么定位不同的页面元素
在JavaScript中,有多种方法定位和选择页面元素。
|
2月前
|
前端开发 JavaScript
前端ES5 | js —添加元素方法
前端ES5 | js —添加元素方法