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

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

  1. Android 如何获取视频的总时长

    在做视频的时候,往往需要获取视频的总时长,比较常用的就是用getDuration()方法获取,但是在获取的时候总是显示获取到的值为-1,在网上找答案的时候,大多解决方案写的都比较简略,对于我这样入门没 ...

  2. iframe标签解析腾讯视频链接的获取不到总时长的解决方案(Txp.play.js)

    记一次项目总结: 腾讯视频(Txp.play.js) <iframe> API 的使用 由于视频URL是来自腾讯视频,所以会出现一个这样的情况:无法获取到用户所看的该视频的总时长,那麽就得 ...

  3. java获取音频_java获取音频文件播放时长

    方法一: 在项目开发过程中,需要获取音视频文件时长.查询资料后发现 JAVE能够完美得到想要的结果,JAVE项目简介如下: The JAVE (Java Audio Video Encoder) li ...

  4. php查看音频属性,PHP获取音频mp3文件时长或音频文件其它参数属性

    标签: 今天在开发项目中遇到一个问题,要获取到上传音频的时长,从而展示在前端页面 最后找到解决方案: 1.首先,我们需要先下载一份PHP类-getid3  https://codeload.githu ...

  5. js 获取 上传视频时长

    有时候我们在上传视频时,可能需要获取视频时长,可以有两种方法 1.创建video标签,赋值src,然后播放获取时长(可将标签隐藏) 2.通过 Audio 对象将 视频文件对象传入,获取时长,代码如下 ...

  6. tp5引入第三方类 实现获取音频(.mp3)文件时长。

    一.你需要在核心之外扩展和使用第三方类库,并且该类库不是通过Composer安装使用,那么可以直接放入应用根目录下面的extend目录下面,该目录是官方建议的第三方扩展类库目录. 二.类的命名规范遵循 ...

  7. Android获取mp3音频文件播放总时长

    Android获取mp3音频文件播放总时长 一般是需要文件的绝对路径,需要读取文件,转成媒体类解析,最好获取播放时长,然后关闭资源. /** * 获取音频文件的总时长大小 * * @param fil ...

  8. 原生js video获取当前视频时间进度和视频总时长

    <div id="toolist"><!-- video测试 --><video src="./resource/VID_0005.3gp& ...

  9. Praat脚本-007 | 计算目录里音频或者TextGrid总时长

    目录 引出 简便操作 脚本 脚本说明 运行脚本 如何获取脚本 关注 版权说明 引出 统计录音时长,是大家经常用到的一个功能,统计的方法有很多,这里小编只介绍两种,一种是在win10系统中的资源管理器中 ...

最新文章

  1. 分享预告:「数据安全问题」+「 股权与期权」
  2. iOS-生成国际化包-配置App多语言支持
  3. oracle hash join outer,CSS_浅谈Oracle中的三种Join方法,基本概念 Nested loop join: Outer - phpStudy...
  4. Java操作控制台的命令
  5. WF(9):本地服务之事件处理
  6. openeim出去会有坏人把自己抓跑
  7. python 调用控制台_如何使用Python的交互控制台
  8. web前端小故事(浏览器大战)
  9. [ERP]ERP原理与应用试题(附答案)
  10. 手机里多个PDF合并成一个PDF的免费方法
  11. linux内核ddr初始化,嵌入式Linux裸机开发(五)——SDRAM初始化
  12. 债券收益率预测模型_证券盈利预测模型
  13. 微信小程序接收二进制流文件(图片预览,文件打开)
  14. redis的setex key seconds value命令的bug
  15. b站百万Up主分享如何做内容
  16. MySQL - 对数据表进行“增删查改”的基础操作 - 细节狂魔
  17. 有1000个瓶子,其中有999瓶是水,1瓶是毒药
  18. GPS时钟的详细说明
  19. javaScript 美化radio
  20. Spring Cloud 链路追踪

热门文章

  1. sudo 命令、配置
  2. 【一天掌握CommandLine】基础入门
  3. 潮玩力真火力!年轻人第一台巨幕影院?酷开电视Max 86“庞然来袭
  4. 全息投影餐厅给餐饮市场带来哪些好处
  5. wpf 后台设置背景色16进制
  6. Ubuntu 安装Openssh服务端
  7. Python--爬虫,了解防盗链-->解决防盗链,解决反反反爬
  8. 上海流浪汉沈_流浪汉厨师独奏
  9. 纺织工业库房如何有效防潮?恒温恒湿真的有效吗?
  10. 互金信用评分建模四步骤