对于网页上的<video></video>视频,可以通过通过监听对象的预加载元数据(loadedmetadata),然后获取视频对象的时长属性object.duration得到视频时长。如果只有一个视频url,也可以通过创建video元素,然后再监听预加载元数据。
获取视频时长函数:
async function getVideoDuration(url) {
return new Promise((resolve, reject) => {
// 1. 创建video元素
const video = document.createElement('video');
// 2. 设置跨域属性(重要!)
video.crossOrigin = "anonymous";
// 3. 设置视频URL
video.src = url;
// 4. 关键:添加预加载元数据的监听
video.addEventListener('loadedmetadata', () => {
// 确保视频时长有效
if (video.duration !== Infinity && !isNaN(video.duration)) {
resolve(video.duration); // 返回秒为单位的时长
} else {
reject(new Error('无法获取有效视频时长'));
}
});
// 5. 错误处理
video.addEventListener('error', (e) => {
reject(new Error(`视频加载失败: ${e.message}`));
});
// 6. 触发加载(部分浏览器需要)
video.load();
});
}说明:async 关键字在JavaScript中用于声明一个异步函数,其主要作用是简化异步编程,使得异步代码看起来更像同步代码,从而提高代码的可读性和可维护性
调用函数获取视频时长:
videoUrl = 'https://yourdomain/video.mp4';
getVideoDuration(videoUrl).then(duration => {
console.log('视频时长:',duration);
});上面代码输出的是秒数,如果想用时分秒的格式,还得格式化一下。
格式化秒数的函数:
function formatDuration(seconds) {
const h = Math.floor(seconds / 3600);
const m = Math.floor((seconds % 3600) / 60);
const s = Math.floor(seconds % 60);
return [h, m, s].map(v => v.toString().padStart(2, '0')).join(':');
}格式化秒数后的时间:
videoUrl = 'https://yourdomain/video.mp4';
getVideoDuration(videoUrl).then(duration => {
console.log('视频时长:',formatDuration(duration));
});输出的时间格式为:00:00:00