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

news2024/10/6 16:18:56

当我们在加载一个线上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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/73716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

商务与经济统计 | 推断统计

一.概率 事件 若干样本点的集合 事件的概率 等于事件中所有的样本点概率之和 条件概率 贝叶斯定理 二.离散型概率分布 随机变量 是一次试验的结果的数值性描述 离散型随机变量 指的是有穷个数值或一系列无穷的数值的随机变量 连续型随机变量 代表某一区间或多个区间…

通配符的应用

我们使用通配符描述切入点&#xff0c;主要的目的就是简化之前的配置&#xff0c;具体都有哪些通配符可以使用? *:单个独立的任意符号&#xff0c;可以独立出现&#xff0c;也可以作为前缀或者后缀的匹配符出现 execution&#xff08;public * com.itheima.*.UserService.find…

webpack基础配置教程

文章目录1.初识Webpack2.开启项目3.处理js和json文件webpack小试牛刀webpack打包js/json文件webpack默认不能处理css4.webpack配置文件1.初识Webpack 什么是webpack? Webpack是一个模块打包器&#xff08;意思同构建工具&#xff0c;所谓构建︰将程序员写完的【源代码】&#…

Sentinel服务熔断功能

Sentinel服务熔断功能 sentinel整合ribbonopenFeignfallback 1、环境搭建&#xff08;新建模块&#xff09; 1.1、启动nacos和sentinel 1.2、新建服务提供者cloudalibaba-provider-payment9003/9004模块 1、引入pom.xml文件 <?xml version"1.0" encoding&quo…

21.前端笔记-CSS-字体图标

1、字体图标产生 使用场景&#xff1a;用于显示网页中通用的小图标iconfont 为什么不用精灵图&#xff1a; &#xff08;1&#xff09;图片文件还是比较大的 &#xff08;2&#xff09;图片本身放大或缩小会失真 &#xff08;3&#xff09;一旦图片制作完毕想要更换&#xf…

ThingsBoard 3.1.1版本在window本地运行之设备直连(二)

目录 前言 1、Thingsboard 框架 2、MQTT设置 1.MQTT概念 2.MQTT在TB里担任的角色 3.MQTT配置 3、结果 前言 ThingsBoard是一个物联网管理平台&#xff0c;这个平台可以让其他企业入驻进来&#xff0c;这些入驻的企业或者个人就是租户&#xff08;tenant&#xff09;&#…

入门系列 - Git工作流程

Git工作流程 Git的工作流程一般如下&#xff1a; 克隆 Git 资源作为工作目录。在克隆的资源上添加或修改文件。如果其他人修改了&#xff0c;你可以更新资源。在提交前查看修改。提交修改。在修改完成后&#xff0c;如果发现错误&#xff0c;可以撤回提交并再次修改并提交。 …

【C++】vector

vector与string许多功能相似&#xff0c;有了string的基础学起来很轻松 文章目录一、vector的介绍二、vector的使用1、vector定义&#xff08;构造&#xff09;类2、vector与string相似的接口3、vector迭代器失效问题三、vector的模拟实现一、vector的介绍 vector文档&#xf…

第十四届蓝桥杯集训——JavaC组第七篇——逻辑运算符

第十四届蓝桥杯集训——JavaC组第七篇——逻辑运算符 目录 第十四届蓝桥杯集训——JavaC组第七篇——逻辑运算符 逻辑运算符 逻辑与 逻辑或 非 逻辑运算法优先级 练习题&#xff1a; 逻辑运算符 &&逻辑与‖逻辑或!逻辑非逻辑运算与位运算不同&#xff0c;逻辑运…

脚本语言Bash简明教程【1】

Bash(GNU Bourne-Again Shell)is a Unix shell and script language written by Brian Fox for the GNU Project as a free software replacement for the Bourne shell. First released in 1989, it has been used as the default login shell for most Linux distributions…

React - Context 使用(共享对于一个组件树而言是 “全局” 的数据)

React - Context 使用&#xff08;共享对于一个组件树而言是 “全局” 的数据&#xff09;一. Context 概念理解二. Context 使用三. Context 组件传值实例Context官网&#xff1a; https://zh-hans.reactjs.org/docs/context.html 一. Context 概念理解 Context 提供了一个无…

Redis缓存雪崩、击穿、穿透、双写一致性、并发竞争、热点key重建优化、BigKey的优化 等解决方案

一. 缓存雪崩 1. 含义 同一时刻&#xff0c;大量的缓存同时过期失效。 2. 产生原因和后果 (1). 原因&#xff1a;由于开发人员经验不足或失误&#xff0c;大量热点缓存设置了统一的过期时间。 (2). 产生后果&#xff1a;恰逢秒杀高峰&#xff0c;缓存过期&#xff0c;瞬间海…

核心竞争力决定未来,中国社会科学院与美国杜兰大学金融管理硕士项目为你助力

随着社会发展的日新月异&#xff0c;知识更新迭代更是以秒来计算&#xff0c;我们不得不为自身有限的技能和认知而焦虑。面对新的机遇最好的应对方法就是要有学习能力&#xff0c;永远学习&#xff0c;终身学习&#xff0c;这是别人永远都抢不走的竞争力。身在金融领域的你&…

关于flex布局和九宫格布局的实现

1.父容器常见属性 display&#xff1a;flex (项目在主轴上的排列方式) justify-content&#xff1a;flex-start / flex-end / center / space-around / space-between &#xff08;项目在交叉轴上的排列方式&#xff09; align-items: flex-start / flex-end / center / ba…

类实现接口,并且对象转型引用,接口引用实现类,抽象类实现接口且被子类继承返回抽象类的值给接口对象转型父类引用子类

类实现接口&#xff0c;并且对象转型引用 目录接口&#xff1a;最最特殊的抽象类。声明行为当多个类有共同的属性和方法用抽象类当符合什么是什么&#xff1f;用继承&#xff1b;继承抽行类当描述能干嘛&#xff1f;用接口接口的方法都是抽象方法的声明接口和抽象类的区别以人的…

集成springSecurity遇到的跨域问题

引言 该项目主要使用技术&#xff1a;sprinboot、springSecurity、vue,其它的技术就不介绍了 其中springSecurity是我参考网上的案例去进行的集成&#xff0c;虽然集成成功了&#xff0c;但是还不是太懂。 下面就开始介绍一下我遇到的问题 问题重现 由于我项目后端集成了s…

[附源码]Python计算机毕业设计Django自行车租赁管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【LSTM时序预测】基于LSTM实现时间序列神经网络预测附MATLAB代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

行话|入局「软件定义汽车」,你真的准备好了吗?

什么是行话&#xff1f; 「行话」&#xff0c;是极狐 GitLab 推出的全新内容系列&#xff0c;探讨 Git 与 DevOps 在不同行业的实践场景与解决方案&#xff0c;希望能够为不同行业的软件开发者带来一些全新的思考和输入。 说行业&#xff0c;讲行话。 这一期&#xff0c;我们…

MMPose 实践笔记

1. 配置环境 参考&#xff1a;https://mmpose.readthedocs.io/zh_CN/latest/install.html 第 1 步 使用 MIM 安装 MMCV pip install -U openmim -i https://pypi.tuna.tsinghua.edu.cn/simple mim install mmcv-full第 2 步 安装 MMPose 我选择 从源码安装 git clone http…