let url = URL.createObjectURL(file);
let audioElement = new Audio(url);
audioElement.addEventListener('loadedmetadata', function (item) {
let duration = parseInt(audioElement.duration);
that.videoDuration = duration;
console.log("秒数:", duration);
});
audioElement.removeEventListener('loadedmetadata', function (item) { });
代码解释
1. let url = URL.createObjectURL(file);
作用:为传入的 file 对象(通常是一个音频文件)生成一个临时的 URL。
说明:file 是一个文件对象,通常来自 <input type="file"> 的文件选择或拖拽上传。
URL.createObjectURL(file) 会生成一个唯一的 URL,指向该文件的内容。这个 URL 是临时的,只在当前页面有效。
2. let audioElement = new Audio(url);
作用:创建一个 <audio> 元素,并设置其 src 为刚刚生成的临时 URL。
说明:new Audio(url) 是 JavaScript 中创建音频对象的一种方式,等同于在 HTML 中使用 <audio src="url"></audio>。此时,音频文件开始加载,但尚未播放。
3. audioElement.addEventListener('loadedmetadata', function (item) { ... });
作用:为音频元素添加一个事件监听器,监听 loadedmetadata 事件。
说明:loadedmetadata 事件在音频的元数据(如时长、编码格式等)加载完成后触发。当元数据加载完成后,回调函数会被执行。
4. let duration = parseInt(audioElement.duration);
作用:获取音频的时长(以秒为单位),并将其转换为整数。
说明:audioElement.duration 返回音频的总时长(以秒为单位,可能是小数)。parseInt 将时长转换为整数(去掉小数部分)。
5. that.videoDuration = duration;
作用:将音频的时长存储到 that.videoDuration 变量中。
说明:that 可能是外部作用域的一个对象或上下文(例如 Vue.js 组件中的 this)。videoDuration 是一个自定义变量,用于存储音频的时长。
6. console.log("秒数:", duration);
作用:在控制台输出音频的时长(以秒为单位)。
说明:这是一个调试语句,用于检查音频时长是否正确加载。
总结
这段代码的核心功能是:
为传入的音频文件生成一个临时 URL。
创建一个音频元素并加载该文件。
监听元数据加载完成的事件,获取音频的时长并存储到变量中。
在控制台输出音频的时长(以秒为单位)。
注意事项
临时 URL 的生命周期:
URL.createObjectURL 生成的 URL 是临时的,页面卸载后会自动释放。如果需要手动释放,可以调用 URL.revokeObjectURL(url)。
跨域问题:
如果音频文件来自不同的域名,可能会遇到跨域问题,导致无法加载元数据。
兼容性:
URL.createObjectURL 和 Audio API 在现代浏览器中广泛支持,但在一些旧版浏览器中可能不兼容。
小数部分:
使用 parseInt 会去掉时长的小数部分。如果需要更精确的时长,可以直接使用 audioElement.duration。
示例场景
假设用户上传了一个 MP3 文件,这段代码可以帮助你获取该文件的时长,并将其存储到变量中,供后续使用(例如显示时长或限制上传文件的长度)。